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

硅谷探秘者 617 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 1155 springmvc信息当服务器代码为: @RequestMapping("/res") publicMyAjaxResultres(@RequestParam(name
spring/springmvc 2479 我在之前进行接口开发的时候经会有大量的,而我般的操作方法就是在controller中进行的校,这样没有什么错,但是代码略显臃肿,而使用springboot的@vaild注解可以减
框架 2508 1.登陆拦截器packagecom.dzqc.yx.interceptor;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importcom.alibaba.fastjson.JSONObject;importcom.dzqc.y
框架 1577 springboot请求json据不对象的指定字段在实体类的字段上加上注解importcom.fasterxml.jackson.annotation.JsonIgnore;例
official 5 中的backlog。函listen(intsocketfd,intbacklog)用来初始化服务端可连接队列。服务端客户端连接请求是顺序的,所以同时间只能个客户端连接,多个客户端
java基础 1422 java发编程之service层发事务加锁可能会无效最近注意到个问题--在service层要多次操作据库事务时往往要@Transactional事务注解,这个时候就要注意了,如果是在
official 38 ChannelHandler用来Channel上的各种事件(包括建立连接,据收发,等)ChannelHandler分为出站和入栈两种。所有的ChannelHandler被连接成串,就
official 129 调度的基本概念当有堆任务要,但由于资源有限,这些事情没法同时。这就需要确定某种规则来决定这些任务的顺序,这就是“调度”研究的问题。在多道程序系中,进程的量往往是多于机的个
归档
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
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录