欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从if-else的参数校验中解放出来

程序员文章站 2022-04-30 09:25:10
...

官方文档

  • hibernate validator官方文档)提供了一套比较完善、便捷的验证实现方式。它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。在Spring Boot 火热的现在,该工具已经包含在spring-boot-starter-web中,不需额外引入其他包。

使用

在DTO中声明要检查的参数

  • 常见的检验注解
    • @Null:被注释的元素必须为 null
    • @NotNull:被注释的元素必须不为 null
    • @AssertTrue:被注释的元素必须为true
    • @AssertFalse:被注释的元素必须为[email protected](value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    • @Max(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    • @DecimalMin(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    • @DecimalMax(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    • @Size(max=, min=):被注释的元素的大小必须在指定的范围内
    • @Digits (integer, fraction):被注释的元素必须是一个数字,其值必须在可接受的范围内
    • @Past:被注释的元素必须是一个过去的日期
    • @Future:被注释的元素必须是一个将来的日期
    • @Pattern(regex=,flag=):被注释的元素必须符合指定的正则表达式
    • @NotBlank(message =):验证字符串非null,且长度必须大于0
    • @Email:被注释的元素必须是电子邮箱地址
    • @Length(min=,max=):被注释的字符串的大小必须在指定的范围内
    • @NotEmpty:被注释的字符串的必须非空
    • @Range(min=,max=,message=):被注释的元素必须在合适的范围内

接口处声明要检查的参数

  • 需要在Controller层的入参位置用@Validated注解声明

    public HttpResult test(@Validated UserDTO userDTO)
    

Web全局异常捕获

  • @Valid在Spring boot中进行绑定参数检验时会抛出异常,需要在Spring Boot中处理

自定义注解校验

分组校验

在不同情况下需要检验的信息不同

定义分组接口

Create.java

import javax.validation.groups.Default;

public interface Create extends Default {
}

Update.java

import javax.validation.groups.Default;

public interface Update extends Default {
}

在DTO需要校验的字段添加声明

@NotNull(message = "id 不能为空", groups = Update.class)
private Long userId;

控制层入参位置进行声明

@RestController
@RequestMapping("/groups")
public class ValidatorGroupsController {

    @PostMapping("/update")
    public HttpResult updateData(@Validated(Update.class)UserDTO userDTO) {
        return HttpResult.success(userDTO);
    }
    
    @PostMapping("/create")
    public HttpResult createData(@Validated(Create.class)UserDTO userDTO) {
        return HttpResult.success(userDTO);
    }
}

@Validate和Valid的区别及使用

概述

@Valid是使用Hibernate validation的时候使用

@Validated是只用Spring Validator校验机制使用

@Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这几种情况进行说明。

注解位置

@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)

@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上

分组校验

@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制

@Valid:没有分组功能

> * 不分配groups时默认每次都要验证
>
> * 对一个参数需要多种验证方式时,也可通过分配不同的组达到目的。

组序列

​ 默认情况下不同级别的约束验证是无序的,但是在一些情况下,顺序验证很重要

​ 一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。

嵌套校验

  • 一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@Valid,才能验证待验证对象中的成员属性,这里不能使用@Validated。
相关标签: 所有文章 Java