设为首页 加入收藏

TOP

使用 SpringBoot 进行优雅的数据验证(一)
2023-08-26 21:11:14 】 浏览:89
Tags:使用 SpringBoot

JSR-303 规范

在程序进行数据处理之前,对数据进行准确性校验是我们必须要考虑的事情。尽早发现数据错误,不仅可以防止错误向核心业务逻辑蔓延,而且这种错误非常明显,容易发现解决。

JSR303 规范(Bean Validation 规范)为 JavaBean 验证定义了相应的元数据模型和 API。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode , 就可以确保数据模型(JavaBean)的正确性。constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

关于 JSR 303 – Bean Validation 规范,可以参考官网

对于 JSR 303 规范,Hibernate Validator 对其进行了参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。如果想了解更多有关 Hibernate Validator 的信息,请查看官网。

validation-api 内置的 constraint 清单

Constraint 详细信息
@AssertFalse 被注释的元素必须为 false
@AssertTrue 同 @AssertFalse
@DecimalMax 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin 同@DecimalMax
@Digits 带批注的元素必须是一个在可接受范围内的数字
@Email 顾名思义
@Future 将来的日期
@FutureOrPresent 现在或将来
@Max 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Min 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Negative 带注释的元素必须是一个严格的负数(0 为无效值)
@NegativeOrZero 带注释的元素必须是一个严格的负数(包含 0)
@NotBlank 同 StringUtils.isNotBlank
@NotEmpty 同 StringUtils.isNotEmpty
@NotNull 不能是 Null
@Null 元素是 Null
@Past 被注释的元素必须是一个过去的日期
@PastOrPresent 过去和现在
@Pattern 被注释的元素必须符合指定的正则表达式
@Positive 被注释的元素必须严格的正数(0 为无效值)
@PositiveOrZero 被注释的元素必须严格的正数(包含 0)
@Szie 带注释的元素大小必须介于指定边界(包括)之间

Hibernate Validator 附加的 constraint#

Constraint 详细信息
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
@CreditCardNumber 被注释的元素必须符合信用卡格式

Hibernate Validator 不同版本附加的 Constraint 可能不太一样,具体还需要你自己查看你使用版本。 Hibernate 提供的 Constraintorg.hibernate.validator.constraints 这个包下面。

一个 constraint 通常由 annotation 和相应的 constraint validator 组成,它们是一对多的关系。也就是说可以有多个 constraint validator 对应一个 annotation。在运行时,Bean Validation 框架本身会根据被注释元素的类型来选择合适的 constraint validator 对数据进行验证。

有些时候,在用户的应用中需要一些更复杂的 constraint。Bean Validation 提供扩展 constraint 的机制。可以通过两种方法去实现,一种是组合现有的 constraint 来生成一个更复杂的 constraint,另外一种是开发一个全新的 constraint。

使用 Spring Boot 进行数据校验

Spring Validation 对 hibernate validation 进行了二次封装,可以让我们更加方便地使用数据校验功能。这边我们通过 Spring Boot 来引用校验功能。

如果你用的 Spring Boot 版本小于 2.3.x,spring-boot-starter-web 会自动引入 hibernate-validator 的依赖。如果 Spring Boot 版本大于 2.3.x,则需要手动引入依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
</dependency>

直接参数校验

有时候接口的参数比较少,只有一个或者两个参数,这时候就没必要定义一个 DTO 来接收参数,可以直接接收参数。

@Validated
@RestController
@RequestMapping("/user")
public class UserController {

    private static Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping("/getUser")
    @ResponseBody
    // 注意:如果想在参数中使用 @NotNull 这种注解校验,就必须在类上添加 @Validated;
    public UserDTO getUser(@NotNull(message = "userId不能为空") Integer userId){
        logger.info("userId:[{}]",userId);
        UserDTO res = new UserDTO();
        res.setUserId(userId);
        res.setName("程序员自由之路");
        res.setAge(8);
        return res;
    }
}

下面是统一异常处理类

@RestControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(v
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇记录一次解决数据库连接池连接泄.. 下一篇Tomcat+Eclipse乱码问题解决方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目