如何自定义校验注解?
如@not null,@not blank,@not empty.@Email等等。但是我们可能有时候根据项目的拓展这些验证注解不够用,那怎么办?为什么他就执行了呢?原理是啥?
1 个回答
为了击碎你伪装的表面,我只能用尽全身力气挥出那惊鸿的半月弧光。云说### 如何自定义校验注解 在Spring Boot中,可以使用如 `@NotNull`、`@NotBlank`、`@NotEmpty`、`@Email` 等内置注解来验证数据。但是在项目中,有时需要自定义校验注解以满足特定需求。以下是创建自定义校验注解的步骤和示例。 #### 1. 创建自定义注解 首先,创建一个自定义注解接口 `MyConstraint`: ```java @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyConstraintValidator.class) public @interface MyConstraint { String message() default "自定义校验注解"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` - `@Target`:指定注解可以应用的地方,比如方法、字段等。 - `@Retention`:指定注解的生命周期,可以选择 `SOURCE`、`CLASS` 或 `RUNTIME`,通常选择 `RUNTIME` 以便在运行时通过反射获取。 - `@Constraint`:指定用于验证该注解的类,即 `MyConstraintValidator`。 #### 2. 创建自定义校验逻辑 然后,创建一个实现 `ConstraintValidator` 接口的类 `MyConstraintValidator`,定义校验逻辑: ```java public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> { @Override public void initialize(MyConstraint constraintAnnotation) { // 初始化逻辑 System.out.println("MyConstraintValidator 初始化"); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { // 校验逻辑 System.out.println(value); // 返回 false 表示验证不通过,返回 true 表示验证通过 return false; } } ``` #### 3. 在实体类中使用自定义注解 在实体类 `User` 中使用自定义注解: ```java @Data public class User { // 使用自定义注解 @MyConstraint private String username; @NotBlank(message = "密码不能为空") private String password; private Integer id; @Past(message = "生日不能是之后的日期") private Date birthday; } ``` #### 4. 使用 @Valid 进行校验 在控制器中使用 `@Valid` 注解进行参数校验: ```java @RestController @Slf4j public class UserController { @PostMapping("/user") public User postUser(@Valid @RequestBody User user, BindingResult bindingResult) { // 如果验证未通过的处理 if (bindingResult.hasErrors()) { // 打印错误 log.info("error={}", bindingResult.getFieldError().getDefaultMessage()); } return user; } } ``` #### 5. 测试 启动应用并测试,在访问 `/user` 接口时,验证逻辑将会执行,并输出自定义校验信息。如果自定义校验未通过,将会输出相应的错误信息。 ### 详细示例代码 **自定义注解接口:** ```java @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyConstraintValidator.class) public @interface MyConstraint { String message() default "自定义校验注解"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` **自定义校验逻辑类:** ```java public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> { @Override public void initialize(MyConstraint constraintAnnotation) { System.out.println("MyConstraintValidator 初始化"); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { System.out.println(value); return false; } } ``` **实体类:** ```java @Data public class User { @MyConstraint private String username; @NotBlank(message = "密码不能为空") private String password; private Integer id; @Past(message = "生日不能是之后的日期") private Date birthday; } ``` **控制器:** ```java @RestController @Slf4j public class UserController { @PostMapping("/user") public User postUser(@Valid @RequestBody User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { log.info("error={}", bindingResult.getFieldError().getDefaultMessage()); } return user; } } ``` 通过上述步骤,即可创建和使用自定义校验注解,满足项目的特殊需求。编辑于 2024-04-04 12:20 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

