Java Spring/AOP通知随机失败
我从两个方面建议了一些方法,一个是使用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
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"/>