HibernateValidator校验框架
前言
版本说明
platform-bom=Cairo-SR7
相关链接
- spring io 官网:https://spring.io/projects/platform
- jakarta maven 地址:https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api
注:spring-boot-starter 和 spring-boot-starte-web 都会自动依赖 jakarta.validation-api 的包
常用注解
注解中有个共同的属性 message,可以自定义错误信息
实战演练
HibernateValidator 校验框架的使用步骤
- 在实体类字段添加校验注解
- 在controller层添加@Valid 注解使之生效
实体类
package top.simba1949.common; import lombok.Data; import javax.validation.constraints.NotNull; import java.io.Serializable; /** * @Author Theodore * @Date 2019/12/2 17:49 */ @Data public class Person implements Serializable { private static final long serialVersionUID = -76403129629930396L; private Integer id; private String username; @NotNull(message = "密码不能为空") private String password; }
Controller 层
package top.simba1949.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import top.simba1949.common.Person; import javax.validation.Valid; /** * @Author Theodore * @Date 2019/12/2 17:50 */ @Slf4j @RestController @RequestMapping("person") public class PersonController { /** * 添加注解 @Valid,才能使实体类Person的校验注解生效 * @param person * @return */ @PostMapping public String insert(@Valid @RequestBody Person person){ log.debug("person is {}", person); return "SUCCESS"; } }
自定义校验注解
自定义校验注解步骤
- 自定义注解并指定校验逻辑类
- 定义校验逻辑类,实现 ConstraintValidator<A extends Annotation, T> 接口,填写具体的校验逻辑
- 和 HibernateValidator 原生注解一样使用即可
自定义注解
package top.simba1949.constraint; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Target(value = {ElementType.FIELD, ElementType.METHOD}) 表示作用域 * @Retention(value = RetentionPolicy.RUNTIME) 表示生效策略 * @Constraint(validatedBy = ValidEmailHandler.class) 由哪个类进行验证 * * @Author Theodore * @Date 2019/12/2 20:25 */ @Target(value = {ElementType.FIELD, ElementType.METHOD}) @Retention(value = RetentionPolicy.RUNTIME) @Constraint(validatedBy = EmailConstraintValidator.class) public @interface EmailValidation { // message()、groups()、payload() 必须存在 String message() default ""; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; }
校验验逻辑类
package top.simba1949.constraint; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * * ConstraintValidator<EmailValidation, String> EmailValidation表示验证哪个注解;String表示用于哪种类型 * * @Author Theodore * @Date 2019/12/2 20:32 */ public class EmailConstraintValidator implements ConstraintValidator<EmailValidation, String> { /** * 初始化 * @param constraint */ @Override public void initialize(EmailValidation constraint) { System.out.println("init"); } /** * 真正的校验逻辑 * @param value 传入的值 * @param context 注解的上下文 * @return false 表示验证不通过,true 表示验证通过 */ @Override public boolean isValid(String value, ConstraintValidatorContext context) { final String emailFormat = "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}"; return value.matches(emailFormat); } }