美文网首页
@Valid 数据校验 + 自定义全局异常信息

@Valid 数据校验 + 自定义全局异常信息

作者: 挺婷Tina | 来源:发表于2019-08-26 22:31 被阅读0次

我们常用@Valid做数据校验,比如现在前端要新增一个用户,我们可以这样校验:

@RestController
public class UserController {

    @PostMapping("/user")
    public void addUser(@RequestBody @Valid RequestDTO requestDTO){
        //其余业务处理
        System.out.println(requestDTO.toString());
    }
}

传入的数据规则如下列代码所示:


@Data
public class RequestDTO {
    @NotNull(message = "名字不能为空")
    String name;

    @NotEmpty(message = "密码不能为空")
    String password;

    @Override
    public String toString() {
        return "name=" + name + ",password=" + password;
    }
}

假设我们模仿前端伪造了一个非法数据(例如密码为空):

{
  "name": "string",
  "password": ""
}

加了@Valid注解的程序就能按我们的预期报错:

{
  "timestamp": "2019-08-26T14:12:02.542+0000",
  "status": 400,
  "error": "Bad Request",
  "errors": [
    {
      "codes": [
        "NotEmpty.requestDTO.password",
        "NotEmpty.password",
        "NotEmpty.java.lang.String",
        "NotEmpty"
      ],
      "arguments": [
        {
          "codes": [
            "requestDTO.password",
            "password"
          ],
          "arguments": null,
          "defaultMessage": "password",
          "code": "password"
        }
      ],
      "defaultMessage": "密码不能为空",
      "objectName": "requestDTO",
      "field": "password",
      "rejectedValue": "",
      "bindingFailure": false,
      "code": "NotEmpty"
    }
  ],
  "message": "Validation failed for object='requestDTO'. Error count: 1",
  "path": "/user"
}

报错信息改进

但这样的报错信息明显太冗余了,我们想简化下,只抛出有问题字段的报错信息,这回就可以结合我们的全局异常进行处理:

1.编写自定义异常处理类,绑定要处理的异常

这里我们注意到@Valid抛出的异常类是MethodArgumentNotValidException ,所以我们将捕获该异常,并对它重新自定义异常信息

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public JsonResult MyExceptionHandle(MethodArgumentNotValidException exception){
        exception.printStackTrace();
        BindingResult result = exception.getBindingResult();
        StringBuilder errorMsg = new StringBuilder() ;
        
        if (result.hasErrors()) {
            List<FieldError> fieldErrors = result.getFieldErrors();
            fieldErrors.forEach(error -> {
                System.out.println("field" + error.getField() + ", msg:" + error.getDefaultMessage());
                errorMsg.append(error.getDefaultMessage()).append("!");
            });
        } 

        exception.printStackTrace();
        return new JsonResult(-1,errorMsg.toString() );
    }
}

上面的代码就是取出里面的报错信息,组装成自己需要显示的信息(这里我们封装成一个json结构,包括状态码和信息返出去):

  1. 试验成果

将刚刚的请求再发一遍,现在就可以看到,错误信息已经按照我们规定的格式返回了:

{
  "code": -1,
  "msg": "密码不能为空!"
}

相关文章

  • @Valid 数据校验 + 自定义全局异常信息

    我们常用@Valid做数据校验,比如现在前端要新增一个用户,我们可以这样校验: 传入的数据规则如下列代码所示: 假...

  • 参数校验优雅写法

    目录 使用validator 项目实战 在全局校验中增加校验异常 自定义参数注解 使用validator java...

  • 自定义JSR-330 注解校验器

    导入包 书写自定义注解 书写自定义实现 Cotroller入参对象加上开启校验注解 @Valid 对象属性具体校验...

  • JDK 之 自定义注解 Annotation

    JDK 之 自定义注解 Annotation 参数校验 注解定义 Validation: 反射解析注解 Valid...

  • SpringBoot全局异常与数据校验

    异常处理是每个项目中都绕不开的话题,那么如何优雅的处理异常,是本文的话题。本文将结合SpringBoot框架一起和...

  • SpringBoot全局异常与数据校验

    异常处理是每个项目中都绕不开的话题,那么如何优雅的处理异常,是本文的话题。本文将结合SpringBoot框架一起和...

  • 参数校验方法

    第一步 在参数上标注@Valid 第二步 参数上设置属性 自定义参数校验 自定义的Validator 自定义的校验代码

  • SpringBoot异常处理

    1. 配置全局异常和自定义异常 异常处理类(包括全局和自定义) 自定义异常类 2.返回自定义页面 创建自定义页面位...

  • Android 异常捕获最少必要知识

    1. 概述 本文主要讲解如何自定义 Android 全局异常捕获,以及如何通过 Dialog 展示异常信息并将异常...

  • SpringMVC利用全局异常数据校验

    异常拦截-数据校验 SSM框架集成数据校验: 导入相关jar包 SSM集成所有jar包+以下jar包 数据校验工具...

网友评论

      本文标题:@Valid 数据校验 + 自定义全局异常信息

      本文链接:https://www.haomeiwen.com/subject/smukectx.html