Валидатор гибернации: перехват неверных значений - PullRequest
1 голос
/ 13 января 2012

Я бы хотел настроить свои 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, который позаботится обо всем этом для меня?Есть ли лучший способ пойти?Заранее спасибо!

1 Ответ

1 голос
/ 15 января 2012

Похоже, что вы все еще используете Hibernate Validator 3.x API около ClassValidator и др.

Я рекомендую обновить до 4.2, где API для проверки метода былпредставил, что в точности соответствует тому, что вы описываете.

Пример необходимого связующего кода для интеграции этого API с Google Guice можно найти в этом проекте , который я недавно создал на GitHub.

...