Определение точки входа Spring AOP для установщика строк - PullRequest
2 голосов
/ 30 ноября 2010

Я разрабатываю аспект, который проверяет строковые аргументы методов установки моего пакета сущностей на наличие пустых строк и заменяет их значениями null.Но, к сожалению, мой аспект не работает хорошо :(. Я думаю, это из-за моего определения точки, но я не уверен.

Мой аспект выглядит так:Spring config выглядит так:

<bean id="emptyStringToNullSetter" class="de.foo.util.aop.parameter.EmptyStringToNullSetter" />
<aop:config>
    <aop:pointcut id="entityStringSetter" expression="execution(* de.foo.entity.*.set*(..)) and args(java.lang.String)" />
    <aop:aspect id="checkEmptyStringsAspect" ref="emptyStringToNullSetter">
        <aop:before method="check" pointcut-ref="entityStringSetter" />
    </aop:aspect>
</aop:config>

Мой тестовый класс выглядит так:

import de.foo.entity.Period;

@ContextConfiguration(locations = { "/spring/test-util-context.xml" })
public class EmptyStringToNullSetterTest extends
    AbstractJUnit4SpringContextTests {
    @Test
    public void testCheck() {
        Period period = new Period();
        period.setName("");
        Assert.assertNull(period.getName());
    }
}

Когда я выполняю свой тест, аспект не перехватывает мой установщик.!

Ура,

Кевин

Ответы [ 2 ]

4 голосов
/ 30 ноября 2010

Поскольку вы используете AOP на основе прокси, совет будет применяться только к бинам Spring, а объект period не является бином.Вам нужно либо иметь «точку» в качестве компонента, либо использовать AOP на основе ткачества AspectJ.В любом случае, вам также нужно будет использовать совет вокруг, а не раньше.

0 голосов
/ 08 августа 2011

Этот дизайн очень сложен и подвержен ошибкам с AOP на основе Spring JDK-прокси.

Я упомянул этот момент здесь: http://doanduyhai.wordpress.com/2011/08/08/spring-aop-advices-on-setters-not-trigged/

По сути, определение аспекта с помощью Spring AOP реализовано во время выполнения как прокси-объект, оборачивающийся вокруг исходной цели.

В жизненном цикле бина Spring будет создавать прокси только после полной инициализации бина, например, после ввода всех свойств сеттером.

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

Однако все последующие вызовы установщика будут перехвачены.

Кроме того, будьте осторожны в вопросах самопризывания, например, вызов метода setter () внутри другого целевого метода.

...