java - 字符串 setter 的 Spring AOP 切入点定义

标签 java spring aop aspectj spring-aop

我正在开发一个方面,用于检查实体包的 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());
    }
}

我的 spring 配置如下:

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

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

干杯,

凯文

最佳答案

由于您使用的是基于代理的 AOP,因此该建议仅适用于 Spring beans,并且“period”对象不是 bean。您需要将“句点”作为 bean 或使用 AspectJ 的基于编织的 AOP。无论哪种情况,您都需要使用 around 建议而不是 before。

关于java - 字符串 setter 的 Spring AOP 切入点定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4308655/

相关文章:

java - 为什么线程不同时运行?

java - 控制台应用程序中出现延迟加载错误

java - 如何使用 AspectJ 拦截 java 类中的静态属性?

hibernate - 使用 Spring 回滚事务 - AOP

.net - Spring.Net 可以用作 PostSharp 吗?

java - JFreechart 刻度单位

java - Java内存泄漏的基础知识

java - 从 JAR 依赖项运行测试

java - 如何防止Hibernate中出现java.lang.IllegalStateException : Transaction already active,错误

java - org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'MyController' :