Dra-M Dra-M
首页
技术
冥思
哲学
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

莫小龙

保持理智,相信未来。
首页
技术
冥思
哲学
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

    • JUC

    • Spring

      • 彻底透析SpringBoot jar可执行原理
      • 使用Hibernate-validator的Notnull等注解校验参数并使用全局异常处理
        • 使用
        • 进阶 使用全局处理
        • 校验注解列表
        • 一些正则
        • 其他
      • 简陋的注解扫描实现
      • SpringBoot+Swagger,快速构建REST API文档
      • Spring&kotlin 异常 NoClassDefFoundError
      • PageHelper不生效问题
      • SpringDataJpa一些注意事项
      • SpringDataJpa的动态条件查询和分页查询
    • Gradle

    • 面向对象

    • Stream流式编程思想及常用API介绍
    • JAVA快速导出Excel
  • Golang

  • 编程思想

  • 微服务

  • 中间件

  • Python

  • 运维

  • 技术
  • Java
  • Spring
莫小龙
2020-07-13
目录
使用
进阶 使用全局处理
校验注解列表
一些正则
其他

使用Hibernate-validator的Notnull等注解校验参数并使用全局异常处理

今天在接受一个老项目时,接口文档丢了,入参实体类根本不知道哪些是要后台填充的,哪些是要前台传过来的,哪些是非空的,

在Controller一堆if else看起来也实在是太乱,这个时候前人如果用了NotNull等注解就好了。

# 使用

Pom:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1
2
3
4

首先在DTO类字段上注解对应的限制;

@Data
public class User {
    @NotBlank(message = "name不能为空")
    private String name;
}
1
2
3
4
5

然后在Controller接受字段,和异常信息

@RestController
@RequestMapping("test")
public class TestController {

  @RequestMapping("hello")
  public String hello(@Valid @RequestBody User user, Errors errors) {
    if (errors.hasErrors()) {
      return errors.getAllErrors().get(0).getDefaultMessage();
    }
    return "hello" + user.getName();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

即可返回错误信息。

# 进阶 使用全局处理

@RestControllerAdvice
public class ControllerAdvice {

  //@ExceptionHandler(MethodArgumentNotValidException.class)
  //public String validationBodyException(MethodArgumentNotValidException exception) {
  //  StringBuilder str = new StringBuilder();
  //  for (FieldError fieldError : exception.getBindingResult().getFieldErrors()) {
  //    str.append(fieldError.getField())
  //        .append(":")
  //        .append(fieldError.getDefaultMessage())
  //        .append("\n");
  //    //
  //  }
  //  return str.toString();
  //}

  // 流式处理版
  @ExceptionHandler(MethodArgumentNotValidException.class)
  public String validationBodyException(MethodArgumentNotValidException exception) {
    return exception.getBindingResult().getFieldErrors().stream()
        .map(e -> e.getField() + ":" + e.getDefaultMessage())
        .reduce((s1, s2) -> s1 + "\n" + s2)
        .orElse("");
  }
}

@RestController
@RequestMapping("test")
public class TestController { 
  @RequestMapping("hello2")
  public String hello2(@Valid @RequestBody User user) {
    return "hello" + user.getName();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

即可返回错误信息。

# 校验注解列表

  • @Null: 被注释的元素必须为null
  • @NotNull: 被注释的元素不能为null
  • @AssertTrue: 被注释的元素必须为true
  • @AssertFalse: 被注释的元素必须为false
  • @Min(value): 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @Max(value): 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @DecimalMin(value): 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @DecimalMax(value): 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @Size(max,min): 被注释的元素的大小必须在指定的范围内。
  • @Digits(integer,fraction): 被注释的元素必须是一个数字,其值必须在可接受的范围内
  • @Past: 被注释的元素必须是一个过去的日期
  • @Future: 被注释的元素必须是一个将来的日期
  • @Pattern(value): 被注释的元素必须符合指定的正则表达式。
  • @Email: 被注释的元素必须是电子邮件地址
  • @Length: 被注释的字符串的大小必须在指定的范围内
  • @NotEmpty: 被注释的字符串必须非空
  • @Range: 被注释的元素必须在合适的范围内

# 一些正则

  • 匹配手机号 ^[1]\d{10}$
  • 不包含小写字母 ^((?![a-z]).)*$
  • 必须是1-6位数字 ^\d{1,6}$
  • 限定几个值 身份证|护照|通行证|台胞证|其他

# 其他

在旧项目中设置时异常没有抛出来,原来是项目中配置了HandlerExceptionResolver把异常拦截了


#SpringBoot
上次更新: 10/23/2024
彻底透析SpringBoot jar可执行原理
简陋的注解扫描实现

← 彻底透析SpringBoot jar可执行原理 简陋的注解扫描实现→

最近更新
01
mosquito配置ws协议
10-23
02
Pip包的离线下载和安装
10-23
03
stable diffusion 相关收藏
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Dra-M
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式