Перехват конкретных аннотаций с помощью Spring AOP

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

Я хотел бы использовать аннотации Hibernate Validator для проверки методов bean-компонентов, и я хотел бы использовать некоторую структуру AOP (Spring, AOP Alliance, AspectJ и т. Д.) Для перехвата методов, аннотированных подмножеством Аннотации Hibernate Validator (@NotNull, @NotEmpty, @Email и т. Д.); Затем я хочу, чтобы при встрече с ними выполнялся совет АОП.

Возможно ли это сделать? Если так, то мне сложно представить себе, как будет работать код. Использование интерфейса Spring AOP MethodInterceptor в качестве примера:

Во-первых, bean-компонент, использующий Hibernate Validator:

public class SomeBean
{
    private String data;

    // Hibernate Validator annotation specifying that "data" cannot be an empty
    // string.
    @NotEmpty
    public String getData() { ... } // etc.
}

Затем код, использующий этот bean-компонент:

public void someMethod()
{
    SomeBean oBean = new SomeBean();

    // Validation should fail because we specified that "data" cannot be empty.
    oBean.setData("");
}

Затем совет АОП, который должен выполняться при обнаружении аннотированных методов Hibernate Validator.

public class ValidationInterceptor implements MethodInterceptor
{
    public Object invoke(MethodInvocation invocation)
    {
        // Here's where we would use Hibernate's validator classes.
        // My code example here is wrong, but it gets the point across.
        Class targetClass = invocation.getClass(); // Should give me SomeBean.class
        ClassValidator<targetClass> oValidator= new ClassValidator<targetClass>();

        // Here I need to get a reference to the instance of the offending
        // SomeBean object whose data has been set to empty...not sure how!
        SomeBean oOffendingBean = getTheBadBeanSomehow();

        InvalidValue[] badVals = oValidator.getInvalidValues(oOffendingBean);
    }
}

Таким образом, я не только задыхаюсь от того, как будет выглядеть конфигурация Spring AOP (определения точек и т. Д.), Чтобы перехватывать аннотации Hibernate Validator, которые мне нужны, и я не только не полностью понимаю, как реализовать фактический совет (например, как создайте оскорбительный SomeBean изнутри совета, как я упоминал выше в комментариях), но я даже не уверен, возможно ли это решение, Spring или иначе.

Заранее благодарим за несколько мягких "подталкиваний" в правильном направлении!


person IAmYourFaja    schedule 18.10.2011    source источник


Ответы (1)


Возможно, вас заинтересует проверка метода функция, представленная в Hibernate Validator 4.2, которая обеспечивает поддержку для проверки параметров метода и возвращаемых значений.

Затем вы можете использовать Seam Validation, который объединяет эту функциональность с CDI. Если вы хотите использовать проверку метода вместе со Spring, вы можете посмотреть этот проект на GitHub, который показывает как интегрировать функциональность проверки метода с Spring AOP (отказ от ответственности: я являюсь автором этого проекта, а также проверки Seam Validation).

Чтобы ваш пример работал, вам нужно пометить параметр метода установки с помощью @NotEmpty следующим образом:

public class SomeBean {

    private String data;

    @NotEmpty
    public String getData() { return data; }

    public void setData(@NotEmpty String data) { this.data = data; }

}
person Gunnar    schedule 18.10.2011
comment
Привет, Гуннар - спасибо за вклад. Я проверяю все три ссылки прямо сейчас. Я не пристрастен к какой-либо конкретной структуре - просто заинтересован в правильном инструменте, который сделает свою работу! Еще раз спасибо - person IAmYourFaja; 19.10.2011