标题SpringBoot@Valid@Validated与先于AOP的执⾏顺序问题SpringBoot @Valid/@Validated与先于AOP的执⾏顺序问题
问题:
想执⾏⼀个这样的操作: 先通过AOP将数据解密,然后再进⾏Valid验证
⽰例代码:
/**
* 仅作为⽰例
springboot aop**/
@PostMapping
@解密注解//本来想是先执⾏这⾥的@注解AOP,然后再去执⾏这⾥的 @Validated验证
public RetVal<Object>test(@RequestBody@Validated Object param){
// do something
}
尝试之后发现 即使设置了Order 也是顺序,也是Valid验证先执⾏,然后再去执⾏切⾯。
这个现象说明Valid的验证 和 AOP 执⾏的时机完全是两个地⽅。不能通过order顺序来修改。
解决思路
阅读源码发现:
Validated验证的执⾏时机是:
在RequestResponseBodyMethodProcessor类resolveArgument⽅法中,
将request请求的参数值进⾏解析之后,然后执⾏了Validated的验证。
也就是Validated验证在解析参数的时候就执⾏了,⽽AOP的执⾏时机却是,在调⽤⽅法的时候才会执⾏。因此Validated验证始终会⽐AOP先执⾏。
解决⽅法(⽰例):
@Around(value ="ponitCut()")
public Object around(ProceedingJoinPoint joinPoint)throws Throwable {
Object[] args = Args();
for(Object arg : args){
Class<?> clazz = Class();
解密注解annotation = DeclaredAnnotation(@解密注解.class);
if(ObjectUtils.isEmpty(annotation)){
continue;
}
//todo 解密操作XXXXX
}
//获取到⽅法
Method method =((MethodSignature)(Signature())).getMethod();
//获取所有的参数注解
Annotation[][] annotationArrs = ParameterAnnotations();
for(int i =0; i < annotationArrs.length; i++){
//遍历到⾃⼰需要的注解,调⽤ValidationUtil等⼯具进⾏⼿动验证
}
return joinPoint.proceed(args);
}
进⾏验证后没有问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论