Я бы хотел настроить свои bean-компоненты на использование и Hibernate Validator (для проверки), и Google Guice (для DI и перехвата методов).
В идеале, я хотел бы иметь настройку, гдеметод, который «проваливает» валидацию, вызовет метод-перехватчик:
public class Widget {
@NotNull
public Fizz getFizz() {
return fizz;
}
}
public class FailedWidgetInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
// This gets executed if Widget's getFizz() returns null...
}
}
Но похоже, что Hibernate Validator позволяет только определять состояние прохождения / неудачи, явно передавая объект T
в ClassValidator<T>
s getInvalidValues()
method.
Так что мне нужно место, чтобы сделать такой звонок!Единственное жизнеспособное решение , о котором я могу подумать, - это создать свою собственную аннотацию (которую я никогда не делал раньше!), Которая могла бы выглядеть так:* А потом в Guice Module
:
public class WidgetModule implements Module {
public void configure(Binder binder) {
binder.bindInterceptor(
any(),
annotatedWith(AutoValidatingNotNull.class),
new ValidatingWidgetInterceptor()
);
}
}
public class ValidatingWidgetInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
ClassValidator<Widget> widgetValidator = new ClassValidator<Widget>();
InvalidValue[] badVals = widgetValidator.getInvalidValues(widget);
if(badVals.length > 0)
handleFailedValidationAndThrowRuntimeExceptionOrSomething();
}
}
Наконец, чтобы изменить getFizz()
:
@AutoValidatingNotNull
public Fizz getFizz() {
return fizz;
}
Для одного, это только почти работает: внутриметод перехватчика invoke
, как мне получить экземпляр widget
(тот, который мы хотим проверить)? .Есть ли способ передать экземпляр widget
с помощью аннотаций?
Редактировать: Не похоже, что я могу передать Object
в аннотации (в качестве параметров) ...
Во-вторых, это немного противно.Возможно, я упускаю из виду то, что предлагает Hibernate Validator, который позаботится обо всем этом для меня?Есть ли лучший способ пойти?Заранее спасибо!