Java Spring/AOP通知随机失败

Java Spring/AOP通知随机失败,java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,我从两个方面建议了一些方法,一个是使用spring AOP支持,另一个是BeanPostProcessor(MethodValidationPostProcessor),它建议使用@Validation注释的所有方法。在我的单元测试中,我试图通过打破方法契约来强制抛出错误,但有时验证已经到位(上述后处理器强加的建议),有时不起作用。有没有人经历过类似的事情 以下是我尝试做的一小部分: 方面代码: @Aspect @Component public final class LoggingAspec

我从两个方面建议了一些方法,一个是使用spring AOP支持,另一个是
BeanPostProcessor
MethodValidationPostProcessor
),它建议使用
@Validation
注释的所有方法。在我的单元测试中,我试图通过打破方法契约来强制抛出错误,但有时验证已经到位(上述后处理器强加的建议),有时不起作用。有没有人经历过类似的事情

以下是我尝试做的一小部分:

方面代码:

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

正在使用@validatedannotation注释的接口(这里是一个包含相关信息的示例)

@已验证
公共接口Dao{
T findById(@NotNull K id);
T persist(@NotNull T object);
}
实现此接口的基类: 公共抽象类BaseDao实现了DAO{ @可通行 公共T持久化(T对象){…} }

以及具有特定行为的子类: 公共最终类UserDao扩展了BaseDao{ @可通行 公共T findById(用户对象){…} }

春天的背景终于是这样了

<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:尝试使用null实体创建saveOrUpdate事件,而不是假定由
相反,
MethodValidationInterceptor
,它为@Validated注释接口建议/截取所有公共方法

编辑:我正在使用spring 3.1、Hibernate Validator 4.2(根据spring的要求)和aspectj 1.7


编辑2:我对测试代码做了进一步的挖掘,发现与MethodValidationPostProcessor或MethodValidationInterceptor相关的东西有些奇怪。我在测试期间禁用了aop autoproxy并删除了LoggerAspect,但仍然存在一些问题,在某些情况下,验证导致了我预期的结果,在某些其他情况下,即使MethodValidationInterceptor失败,或者MethodValidator未能捕获调用中的错误

仔细研究,我发现问题与我把注释放在哪里有关。很抱歉给您带来不便

@Validated
public interface Dao<T, K> {
    T findById(@NotNull K id);
    T persist(@NotNull T 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"/>