springboot参数验证(@Valid)全局异常统一处理并返回

硅谷探秘者 2372 0 0

参数校验失败统一返回给前端异常信息

参数校验如何使用参考:http://www.jiajiajia.club/blog/artical/yjw520/248

校验需要的pom依赖
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.13.Final</version>
        </dependency>
常用校验注解
  1. @Null 限制只能为null
  2. @NotNull 限制必须不为null
  3. @AssertFalse 限制必须为false
  4. @AssertTrue 限制必须为true
  5. @DecimalMax(value) 限制必须为一个不大于指定值的数字
  6. @DecimalMin(value) 限制必须为一个不小于指定值的数字
  7. @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
  8. @Future 限制必须是一个将来的日期
  9. @Max(value) 限制必须为一个不大于指定值的数字
  10. @Min(value) 限制必须为一个不小于指定值的数字
  11. @Past 限制必须是一个过去的日期
  12. @Pattern(value) 限制必须符合指定的正则表达式
  13. @Size(max,min) 限制字符长度必须在min到max之间
  14. @Past 验证注解的元素值(日期类型)比当前时间早
  15. @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
  16. @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
  17. @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
 全局统一异常处理配置类
import com.alibaba.fastjson.JSON;
import com.elasticsearch.entity.Result;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 *  全局统一异常处理
 */
@Order(-1000)
@Component
public class ParamValidExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse response, Object o, Exception e) {
        StringBuilder sb = new StringBuilder();
        //处理异常
        if(e instanceof MyException) {
            //自定义异常
            resolverBussinessException(e, sb);
        } else if (e instanceof BindException) {
            //参数校验异常
            resolverBindException(e, sb);
        } else {
            //其他异常
            resolverOtherException(e, sb);
        }
        /**
         *  返回前端json字符串
         */
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Cache-Control", "no-cache, must-revalidate");
        try {
            // Result 是你返回给前端的数据类型,自己定义
            response.getWriter().write(JSON.toJSONString(Result.err(sb.toString())));
        } catch (IOException ex) {
            e.printStackTrace();
        }
        return new ModelAndView();
    }
    /*
     * 处理业务层异常
     */
    private void resolverBussinessException(Exception ex, StringBuilder sb) {
        MyException myException = (MyException) ex;
        sb.append(myException.getMessage());
    }
    /*
     * 处理参数校验
     */
    private void resolverBindException(Exception ex, StringBuilder sb) {
        BindException be = (BindException) ex;
        List<FieldError> errorList = be.getBindingResult().getFieldErrors();
        for (FieldError error : errorList) {
            sb.append(error.getObjectName());
            sb.append("对象的");
            sb.append(error.getField());
            sb.append("字段");
            sb.append(error.getDefaultMessage());
        }
    }
    /*
     * 处理其他异常
     */
    private void resolverOtherException(Exception ex, StringBuilder sb) {
        sb.append(ex.getMessage());
    }
}

 


评论区
请写下您的评论...
暂无评论...
猜你喜欢
spring/springmvc 2191 springmvc信息当服务器代码为: @RequestMapping("/res") publicMyAjaxResultres(@RequestParam(name
spring/springmvc 4167 我在之前进行接口开发的时候经会有大量的,而我般的操作方法就是在controller中进行的校,这样没有什么错,但是代码略显臃肿,而使用springboot的@vaild注解可以减
框架 6769 1.登陆拦截器packagecom.dzqc.yx.interceptor;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importcom.alibaba.fastjson.JSONObject;importcom.dzqc.y
框架 4126 springboot请求json据不对象的指定字段在实体类的字段上加上注解importcom.fasterxml.jackson.annotation.JsonIgnore;例
java基础 3578 当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里[1],字节码解释器工作时就是通过改变这个计器的值来选取下条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、
official 705 中的backlog。函listen(intsocketfd,intbacklog)用来初始化服务端可连接队列。服务端客户端连接请求是顺序的,所以同时间只能个客户端连接,多个客户端
ASM,java基础 966 、InvocationHandler  InvocationHandler可以实现对接口的代,类似与mybatis,代码中开发者只需要写个接口和个xml,mybatis会根据xml的描述信息,帮你生成对应的方法实现,的解析
java基础 3704 java发编程之service层发事务加锁可能会无效最近注意到个问题--在service层要多次操作据库事务时往往要@Transactional事务注解,这个时候就要注意了,如果是在
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。