2016-09-15 5 views
1

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

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

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

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

Любые идеи?

+0

Я считаю, что Spring может использовать CGLib, но я не знаком с внутренностями его маршрутизации '@ Valid'. – chrylis

ответ

2

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

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