spring validation针对基本类型进行校验

Bean Validation针对Java Bean进行了很好的处理,但是对于基本类型无法进行验证,如下面这个controller的请求, @Valid不会生效

@PostMapping("/save")
public Map save(@Email
               @Valid
               @RequestParam("email")
               String email) {
    return emailMessage(email);
}

在查阅资料的时候遇到看到:https://sdqali.in/blog/2015/1...
文中讲述了采用@Validated注解,以及配置全局异常处理器来解决,但是我尝试了,还是没有成功。

不可能强行将一两个基本类型参数封装成Java Bean,这样不合理,而且如果,有些地方校验还要多一个参数怎么办,比如a请求需要校验email,b请求需要校验email和validcode,这样强行封装Java Bean (email和validcode就不合理了)

各位遇到过么,有什么好的解决办法吗?谢谢

在这里发现有个用户提过一个类似的问题,但是我觉得楼下的回答并没有实际解决这个问题,所以重提一遍,附上他的问题链接:https://segmentfault.com/q/10...

阅读 6.3k
1 个回答

已搞定,hibernate validation已经针对这个做了方法级别校验,包括参数,构造方法,返回值等校验
可以参考官方文档:
https://docs.jboss.org/hibern...
Validating method constraints小节

 @PostMapping("/valid")
 public Map valid(@NotBlank String email) {...}
 

统一做AOP处理,

@Component
@Aspect
public class RequestParamValidAspect {
    @Pointcut("execution(* site.sixteen.validation.web.*.*(..))")
    public void controllerBefore() {
    }

    @Before("controllerBefore()")
    public void before(JoinPoint point) {
        Object target = point.getThis();
        // 获得切入方法参数
        Object[] args = point.getArgs();
        // 获得切入的方法
        Method method = ((MethodSignature) point.getSignature()).getMethod();

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        ExecutableValidator executableValidator = factory.getValidator().forExecutables();

        // 执行校验,获得校验结果
        Set<ConstraintViolation<Object>> validResult = executableValidator.validateParameters(target, method, args);
        //如果有校验不通过的
        if (!validResult.isEmpty()) {
        }
        //返回第一条
    }
}

debug运行会看到validResult会有相应的校验结果

果然,这种东西应该是存在的,我就纳闷为什么会有Java Bean校验,反而没有基本类型参数校验,还想着要不要自己去弄一个,忒麻烦勒。

不懂得可以加我QQ:1016593477 一起探讨

推荐问题
宣传栏