Java JSR-303 Автоматическая проверка компонентов без переплетения байт-кода

Есть ли способ выполнить (более или менее) «автоматическую» проверку Java-бина JSR-303 без модификации класса во время выполнения?

Обычно я вижу, как люди используют AspectJ для достижения этой цели, но у нас было так много сложностей при использовании объединения кода во время выполнения (например, с cofoja), которого я хотел бы избежать. Это приводит к сбою многих наших инструментов сборки, потому что файлы классов среды выполнения отличаются от файлов классов на диске.

Я просмотрел динамические прокси. через отражение, которое может использовать только прокси-интерфейсы (общедоступные методы), И если вы вызываете что-либо, аннотированное внутри «этого», вы больше не проходите через прокси, поэтому вы теряете эту проверку.

Я также просмотрел ByteBuddy, чтобы найти способ возможного перехвата вызовов методов путем переноса/переопределения класса. Здесь может быть что-то, но я не могу понять, как перехватывать частные методы или выполнять вышеуказанное, не возвращаясь к изменению исходного класса.

Любые идеи?


person akagixxer    schedule 15.09.2016    source источник
comment
Я считаю, что Spring может использовать CGLib, но я не знаком с внутренностями его маршрутизации @Valid.   -  person chrylis -cautiouslyoptimistic-    schedule 16.09.2016


Ответы (1)


Теоретически вы можете обеспечить проверку bean-компонента только путем отражения. Но я предполагаю, что под автоматическим вы подразумеваете без явного вызова метода проверки.

В этом случае инструменты, вероятно, ваш единственный вариант. С помощью Byte Buddy вы можете инструментировать существующие методы, используя переопределение или перебазирование. Самый простой способ сделать это — использовать агент Java с помощью построителя агентов или плагинов Gradle или Maven для инструментовки времени сборки. Документация представляет собой пример того, как реализовать агент, а инструменты сборки содержат много javadoc (документация в процессе).

person Rafael Winterhalter    schedule 16.09.2016