Spring AOP:字段验证不起作用
我有一个Jersey资源类,它对头参数使用字段验证Spring AOP:字段验证不起作用,spring,aop,spring-aop,bean-validation,Spring,Aop,Spring Aop,Bean Validation,我有一个Jersey资源类,它对头参数使用字段验证 @Controller @RequiredArgsConstructor public class Resource { @Min(value = 0) @HeaderParam("id") private int id; @HeaderParam("Authorization") private String header; @Authenticate public void ge
@Controller
@RequiredArgsConstructor
public class Resource {
@Min(value = 0)
@HeaderParam("id")
private int id;
@HeaderParam("Authorization")
private String header;
@Authenticate
public void get() {
}
}
然后我在@Authenticate注释处创建了一个切入点
public class Aspect {
@Before("@annotation(Authenticate)")
public void doAuthenticate() {
}
}
问题是,在创建方面之后,id的字段验证不再有效(传入-1作为id头不会违反约束)
我猜原因是因为SpringAOP使用CGLIB作为代理,它在创建代理时不填充字段,所以默认值传递给验证,然后在脱离方面之后,它已经脱离验证阶段,因此验证不起作用
因此,我的问题是:
1.我理解正确吗?
2.如何使字段验证工作正常?我对Spring或Jersey都不太了解,但您是对的,因为动态代理只是名称所暗示的:代理。它包装原始对象的方法,使您能够拦截它们,例如通过AOP。它不代理或复制成员变量。因此,要么使用AspectJ而不是SpringAOP,完全避免使用代理,要么需要配置验证,确保验证在原始对象上完成,而不是在代理上完成。不过,如果没有一个答案,我就不能多说了。GitHub会很好。@kriegaex谢谢您的评论。我最终决定不依赖于字段参数。