Loading

SpringBoot表单验证

1、引入依赖(springboot版本:2.5.4,不知道为什么里面没有@NotEmpty相关的依赖了,网上的说好像新版的Spring Boot不再自动集成hibernate-validation,需要手动添加依赖)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2、在实体类上创建对应的验证规则

  @Data
  @NoArgsConstructor
  @TableName("sys_user")
  @EqualsAndHashCode(callSuper = true)
  public class Test extends Model<Test> {

      private static final long serialVersionUID = 1L;

      /**
       * 主键ID
       */
      @TableId(type = IdType.AUTO)
      @ApiModelProperty(value = "主键ID")
      private Integer userId;
      /**
       * 账号
       */
      @ApiModelProperty(value = "账号")
      @NotEmpty(message = "账号不能为空")
      private String userAccount;
      /**
       * 姓名
       */
      @ApiModelProperty(value = "姓名")
      @NotEmpty(message = "姓名不能为空")
      private String userName;
      /**
       * 密码
       */
      @ApiModelProperty(value = "密码")
      @NotEmpty(message = "密码不能为空")
      private String userPassword;

  }

常用规则说明,更多参考官方文档

注解 说明
@Null 限制只能为null
@NotNull 限制必须不为null
@NotEmpty 验证注解的元素值不为 null 且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在 min 到 max 之间(也可以用在集合上)
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字

3、在controller接口的方法参数加入@Validated注解

  @Slf4j
  @RestController
  @RequestMapping("/test")
  @Api(value="测试",tags={"测试"})
  public class TestController {

      @PostMapping
      @ApiOperation(value = "测试接口", notes = "测试接口")
      public R tests(@Validated @RequestBody Test test) {
          log.info("tests-->{}",test);
          return R.success();
      }

  }

4、创建全局异常处理

  /**
   * @ClassName: ExceptionHandle
   * @Description: 全局异常处理
   * @Author: TanXJ
   * @Date: 2021/10/12 17:49
   */
  @Log4j2
  @RestControllerAdvice
  public class ExceptionHandle {

      @ResponseStatus(value = HttpStatus.OK)
      @ExceptionHandler(MethodArgumentNotValidException.class)
      @ResponseBody
      public R exceptionHandler(MethodArgumentNotValidException exception) {
          log.error(exception.getMessage(), exception);
          return R.fail(401, exception.getBindingResult().getFieldError().getDefaultMessage());
      }
  }

返回值R是我自定义的返回类,可以更换为自己的返回类,下面这个是我使用的返回类

  import lombok.Data;
  import lombok.NoArgsConstructor;

  /**
   * 统一API对象返回
   * @param <T>
   * @Author: TanXJ
   * @Date: 2021/10/13 9:31
   */
  @Data
  @NoArgsConstructor
  public class R<T> {
      /**
       * 状态码
       */
      private Integer code;

      /**
       * 返回消息
       */
      private String message;

      /**
       * 状态
       */
      private boolean status;

      /**
       * 返回数据
       */
      private T data;

      public R(Integer code, String message, boolean status, T data) {
          this.code = code;
          this.message = message;
          this.status = status;
          this.data = data;
      }

      public R(IResultCode resultCode, boolean status, T data) {
          this.code = resultCode.getCode();
          this.message = resultCode.getMessage();
          this.status = status;
          this.data = data;
      }

      public R(IResultCode resultCode, boolean status) {
          this.code = resultCode.getCode();
          this.message = resultCode.getMessage();
          this.status = status;
          this.data = null;
      }

      public static <T> R success() {
          return new R<>(ResultCode.OK, true);
      }

      public static <T> R message(String message) {
          return new R<>(ResultCode.OK.getCode(), message, true, null);
      }

      public static <T> R success(T data) {
          return new R<>(ResultCode.OK, true, data);
      }

      public static <T> R fail() {
          return new R<>(ResultCode.ERROR, false);
      }

      public static <T> R fail(IResultCode resultCode) {
          return new R<>(resultCode, false);
      }

      public static <T> R fail(Integer code, String message) {
          return new R<>(code, message, false, null);
      }

      public static <T> R fail(IResultCode resultCode, T data) {
          return new R<>(resultCode, false, data);
      }

      public static <T> R fail(Integer code, String message, T data) {
          return new R<>(code, message, false, data);
      }

  }

这样就可以啦,这是我的测试结果

posted @ 2021-10-13 10:21  路遥_13  阅读(268)  评论(0编辑  收藏  举报