SpringBoot 使用hibernate validator校验

网友投稿 338 2023-01-18


SpringBoot 使用hibernate validator校验

本文将全面的介绍如何使用 validator 进行数据校验

本文源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate

准备工作

我们只需要引入 spring-boot-starter-web 包即可使用

1.常用注解

常用注解

2.简单的实体校验

public class CardDTO {

@NotBlank

private String cardId;

@Size(min = 10, max = 10)

@NotNull

private String cardNum; // 卡号

@Past

@NotNull

private Date createDate;

@Range(max = 3)

private String cardType;

// 省略get set

}

@RestController

public class UserController {

@PostMapping("simple")

public Object simple(@RequestBody @Valid CardDTO cardDTO) {

return cardDTO;

}

}

实体属性上添加校验注解

controller 方法 参数前 使用@Valid 即可

3. 复杂的实体校验

3.1 嵌套实体校验

public class UserDTO {

@NotBlank

private String userId;

@NotBlank

private String username;

private String password;

@Valid

private List cardList;

//省略 get set

}

controller 写法 同上,只是在 UserDTO cardList 属性上标记@Valid 注HXayw解 即可。 3.2 List 校验

无效示例

如果我们想校验 一个实体List,如上图所示的这种写法是完全不起效的。

我们需要像 嵌套校验 时一样,对 List 做一层封装

public class ValidList implements List {

@Valid

private List list = new ArrayList<>();

public List getList() {

return list;

}

public void setList(List list) {

this.list = list;

}

// 省略了 实现方法

}

重写实现方法完全使用 this.list.xxx()

Gitee:spring 会将数据封装到我们定义的 list 属性中,又将属性声明了 @Valid 使得 hibernate validator 可以为我们做校验!

3.3 使用 @Validated 分组校验

public interface Insert {

}

public interface Update {

}

定义两个接口

public class GroupCardDTO {

@NotBlank(groups = {Update.class})

private String id;

@NotBlank(groups = {Insert.class})

private String cardNum;

@NotNull(groups = {Insert.class, Update.class})

private Integer cardType;

//省略 get set

}

实体标记的注解中添加 group 属性

@PostMapping("insert_card")

public Object insert_card(@RequestBody @Validated(Insert.class) GroupCardDTO card){

return card;

}

使用 @Validated(xxx.class) 标记参数,完成分组校验!

4.自定义注解校验

当 validator 提供的注解无法满足我们的业务需求,可以通过自定义的方式来实现校验。

需求:校验某字符串必须为大写或者小写

public enum CaseMode {

UPPER,

LOWER

}

定义一个枚举类

import javax.validation.Consthttp://raint;

import javax.validation.Payload;

import java.lang.annotation.*;

@Target( { ElementType.FIELD })

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = CheckCaseValidator.class)

@Documented

public @interface CheckCase {

String message() default "";

Class>[] groups() default {};

Class extends Payload>[] payload() default {};

CaseMode value() default CaseMode.LOWER;

}

定义注解

@Constraint 指定我们的校验逻辑实现类

import javax.validation.ConstraintValidator;

import javax.validation.ConstraintValidatorContext;

public class CheckCaseValidator implements ConstraintValidator {

private CaseMode caseMode;

@Override

public void initialize(CheckCase constraintAnnotation) {

this.caseMode = constraintAnnotation.value();

}

@Override

public boolean isValid(String value, ConstraintValidatorContext context) {

if (value == null || "".equals(value.trim())) {

return false;

}

switch (this.caseMode) {

case LOWER:

return value.equals(value.toLowerCase());

case UPPER:

return value.equals(value.toUpperCase());

default:

return false;

}

}

}

initialize() 初始化时执行,可以用来获取注解中的属性

isValid() 实现我们的校验逻辑

备注

我们自定义的注解依然支持 @Validated group 分组

本节源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate

本地下载地址:springboot-validate_jb51.rar


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:实现接口和类继承区别(接口的继承和类的继承)
下一篇:Mybatis中collection和association的使用区别详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~