2

我正在开发一个方面,它检查我的实体包的 setter 方法的字符串参数是否有空字符串,并将它们替换为null值。但不幸的是,我的方面效果不佳:(。我想这是因为我的切入点定义,但我不确定。

我的方面看起来像:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class EmptyStringToNullSetter {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(EmptyStringToNullSetter.class);

    public void check(final JoinPoint jp) {
        LOGGER.debug(jp.getSignature().toLongString());
    }
}

我的弹簧配置看起来像:

<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());
    }
}

当我执行我的测试时,方面不会拦截我的设置器。有谁知道为什么?!

干杯,

凯文

4

2 回答 2

4

由于您使用的是基于代理的 AOP,因此建议将仅适用于 Spring bean,并且“周期”对象不是 bean。您需要将“句点”作为 bean 或使用 AspectJ 的基于编织的 AOP。在这两种情况下,您还需要使用周围的建议而不是之前的建议。

于 2010-11-29T23:11:16.000 回答
0

对于基于 Spring JDK 代理的 AOP,这种设计非常棘手且容易出错。

我在这里提到了这一点:http: //doanduyhai.wordpress.com/2011/08/08/spring-aop-advices-on-setters-not-trigged/

基本上,使用 Spring AOP 定义的方面在运行时实现为围绕原始目标的代理对象。

在 bean 生命周期中,Spring 只会在 bean 完全初始化后创建代理,例如在所有属性由 setter 注入之后。

所以第一次调用你的 setter 时,它不会被通知拦截,因为代理还不存在。

然而,所有随后对 setter 的调用都将被拦截。

此外,要小心自调用问题,例如在另一个目标方法中调用 setter()。

于 2011-08-08T11:29:10.667 回答