zoukankan      html  css  js  c++  java
  • Spring 捕捉校验参数异常并统一处理

    使用 @Validated ,@Valid ,@NotBlank 之类的,请自行百度,本文着重与捕捉校验失败信息并封装返回出去

    参考:

    https://mp.weixin.qq.com/s/EaZxYKyC4L_EofWdtyBCpw

    https://www.jianshu.com/p/bcc5a3c86480

    捕捉校验失败异常信息

    @ControllerAdvice
    public class WebExceptionHandler {
    
       //处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常,详情继续往下看代码 @ExceptionHandler(BindException.
    class) @ResponseBody public ResponseVO BindExceptionHandler(BindException e) { String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); return new ResponseVO(message); } //处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public ResponseVO ConstraintViolationExceptionHandler(ConstraintViolationException e) { String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining()); return new ResponseVO(message); } //处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。 @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ResponseVO MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); return new ResponseVO(message); } }

    如下示例请求参数报错的话,会抛出 BindException 而不是  ConstraintViolationException 和 MethodArgumentNotValidException

    @RestController
    @RequestMapping("test")
    public class TestController {
    
        @GetMapping("refund")
        public ResponseVO refund(@Valid RefundRequest request) throws Exception {
            return new ResponseVO();
        }
    }
    
    @Data
    public class RefundRequest implements Serializable {
        @NotBlank(message = "订单号不能为空")
        private String orderId;
        @Min(value = 0, message = "已消费金额金额不能为负数")
        private int orderAmt;
    }

    如果多个请求参数都校验失败,则遇到第一个校验失败就抛出异常,接下来的异常参数不做校验,配置如下

    @Configuration
    public class WebConfig {
        @Bean
        public Validator validator() {
            ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                    .configure()
                    //failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
                    .failFast(true)
                    .buildValidatorFactory();
    
            return validatorFactory.getValidator();
        }
    
        @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor() {
            MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
            methodValidationPostProcessor.setValidator(validator());
            return methodValidationPostProcessor;
        }
    }
  • 相关阅读:
    SOAP webserivce 和 RESTful webservice 对比及区别(转载)
    JavaWeb工程中web.xml基本配置(转载学习)
    iframe 自适应
    SQL分组求每组最大值问题的解决方法收集 (转载)
    关于试用jquery的jsonp实现ajax跨域请求数据的问题
    解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。
    Hadoop编译源码(面试重点)
    Hadoop学习(二)自己编译Hadoop安装包
    代理模式实现方式及优缺点对比
    zookeeper
  • 原文地址:https://www.cnblogs.com/fqybzhangji/p/10384347.html
Copyright © 2011-2022 走看看