SpringBoot 使用Validation进行数据校验 全局异常捕获自定义输出格式

SpringBoot 使用validation进行数据校验

Validation

Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的

Validation相关注解含义

  • @Null 限制只能为null
  • @NotNull 限制必须不为null
  • @AssertFalse 限制必须为false
  • @AssertTrue 限制必须为true
  • @DecimalMax(value) 限制必须为一个不大于指定值的数字
  • @DecimalMin(value) 限制必须为一个不小于指定值的数字
  • @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
  • @Future 限制必须是一个将来的日期
  • @Max(value) 限制必须为一个不大于指定值的数字
  • @Min(value) 限制必须为一个不小于指定值的数字
  • @Past 限制必须是一个过去的日期
  • @Pattern(value) 限制必须符合指定的正则表达式
  • @Size(max,min) 限制字符长度必须在min到max之间
  • @Past 验证注解的元素值(日期类型)比当前时间早
  • @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
  • @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
  • @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

使用示例:

message 代表的就是对应的提示信息

在对应的实体类添加注解限制之后还需要在用到该实体的地方加上@Valid注解

完成这一步骤后进行测试
不输入参数测试得到以下输出结果:

    `{
  "timestamp": "2018-04-14T08:52:18.500+0000",
  "status": 400,
  "error": "Bad Request",
  "errors": [
    {
      "codes": [
        "NotEmpty.imUser.userName",
        "NotEmpty.userName",
        "NotEmpty.java.lang.String",
        "NotEmpty"
      ],
      "arguments": [
        {
          "codes": [
            "imUser.userName",
            "userName"
          ],
          "arguments": null,
          "defaultMessage": "userName",
          "code": "userName"
        }
      ],
      "defaultMessage": "姓名不能为空!",
      "objectName": "imUser",
      "field": "userName",
      "rejectedValue": null,
      "bindingFailure": false,
      "code": "NotEmpty"
    },
    {
      "codes": [
        "NotEmpty.imUser.workId",
        "NotEmpty.workId",
        "NotEmpty.java.lang.String",
        "NotEmpty"
      ],
      "arguments": [
        {
          "codes": [
            "imUser.workId",
            "workId"
          ],
          "arguments": null,
          "defaultMessage": "workId",
          "code": "workId"
        }
      ],
      "defaultMessage": "工号不能为空",
      "objectName": "imUser",
      "field": "workId",
      "rejectedValue": null,
      "bindingFailure": false,
      "code": "NotEmpty"
    }
  ],
  "message": "Validation failed for object='imUser'. Error count: 2",
  "path": "/user"
}`

可以看到Valid注解确实起到了作用,可是这输出格式不是我们想要的,下面就需要进行输出格式自定义

通过观察看出当参数不符合规范是会抛出BindException异常,这样的话我们就可以通过全局异常捕获来进行自定义格式输出。

全局异常捕获

SpringBoot提供了全局异常捕获注解@ControllerAdvice

首先定义一个全局异常捕获类GlobalExceptionHandler,加上注解ControllerAdvice,如下

在GlobalExceptionHandler类中定义了一个处理异常的方法handlerBindException

主要看方法上的注解:

@ExceptionHandler(BindException.class):ExceptionHandler所有的异常类只要发生
了就会这个注解所修饰的方法所捕获,代表捕获BindException异常

@ResponseBody :返回JSON格式数据

,在抛出BindException异常情况下会携带异常信息进入handlerBindException方法中

在方法中获取我们在实体类中定义的提示信息,并返回。

最后看下经过捕获后异常输出数据:

可以看出输出结果和意向中的一样。

猜你喜欢

转载自blog.csdn.net/swollow_/article/details/79942305