spring boot在Post接受一个对象参数的时候可以使用@Valid去验证,如下代码
@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()); } } }
在创建一个User类
@Data public class User { private String username; @NotBlank(message = "密码不能为空") private String password; private Integer id; @Past(message = "生日不能是之后的日期") private Date birthday; }
上面的@NotBlank和@Past就做了一个判断,如何做类似的注解用来验证数据
创建一个MyConstraint的接口
@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 {}; }
@Retention :用来说明该注解类的生命周期。它有以下三个参数:
RetentionPolicy.SOURCE : 注解只保留在源文件中
RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
RetentionPolicy.RUNTIME : 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
@Target : 用来说明该注解可以被声明在那些元素之前。
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前。
@Constraint来限定自定义注解的方法
这里写的类是下面自定义的类
接口里面的方法是其他注解上都有这些方法,列如@Past
创建MyConstraintValidator的类
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> { @Override public void initialize(MyConstraint myConstraint) { //初始化的时候 System.out.println("my validator init"); } @Override public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) { //这里写判断逻辑 System.out.println(o); //我这里直接方法false,就是要提示错误,如果返回true就表示验证通过 return false; } }
现在就可以在User类里使用,上面注解MyConstraint定义message的时候没有设置默认值
@Data public class User { //使用自定义注解 @MyConstraint private String username; @NotBlank(message = "密码不能为空") private String password; private Integer id; @Past(message = "生日不能是之后的日期") private Date birthday; }
现在访问一下看控制台就能显示错误了