Spring / AOP建议随机失败

时间:2012-08-15 15:41:21

标签: java spring aop spring-aop

我有两个方面建议的方法,一个是使用spring AOP支持,另一个是BeanPostProcessor(具体为MethodValidationPostProcessor),它建议使用@Validation注释的所有方法。通过我的单元测试,我试图通过违反方法合同强制抛出错误,但有时验证到位(上述后处理器强加的建议),有时不起作用。有没有人经历过类似的事情。

以下是我想要做的一小部分:

Aspect代码:

@Aspect
@Component
public final class LoggingAspect {
    @Before(value = "execution(public * * (..)) && @annotation(loggable)",
    argNames = "joinPoint, loggable")
    public void before(JoinPoint joinPoint, Loggable loggable) {
         //logging here... 
    }
}

注释(可记录代码)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Loggable {...}

使用@Validated注释注释接口(这是带有相关信息的link)。

@Validated
public interface Dao<T, K> {
    T findById(@NotNull K id);
    T persist(@NotNull T object);
}

实现此接口的基类:     公共抽象类BaseDao实现DAO {         @Loggable         public T persist(T object){...}     }

具有特定行为的子类:     公共最终类UserDao扩展BaseDao {         @Loggable         public T findById(User object){...}     }

最后的春天语境是这样的

<aop:aspectj-autoproxy/>
<context:annotation-config/>
<context:component-scan base-package="com.my.package"/>
<bean id="validator"
  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

我正在通过调用两个方法以null作为参数进行测试,但在某些情况下,我收到IllegalArgumentException: attempt to create saveOrUpdate event with null entity而不是MethodConstraintViolationException,而不是MethodValidationInterceptor 而{{1}}建议/拦截@Validated带注释接口的所有公共方法。

编辑:我使用的是Spring 3.1,Hibernate Validator 4.2(按照春天的要求)和aspectj 1.7。

编辑2 :我对测试代码进行了一些挖掘,我发现有一些与MethodValidationPostProcessor或MethodValidationInterceptor有关的奇怪内容。我在测试期间禁用了aop-autoproxy并删除了LoggerAspect,但仍然存在一些问题,在某些情况下,验证会导致我的预期,并且在某些其他情况下,即使它应该使MethodValidationInterceptor失败或者MethodValidator失败捕获调用中的错误。

1 个答案:

答案 0 :(得分:0)

四处寻找我发现问题与我放置注释的位置有关。很抱歉给您带来不便。