在业务开发时使用注解能大量节省我们的开发时间,使代码更简洁,用户只需关注业务逻辑,但有些注解并不能满足我们的需求,所以需要自己定义,以下定义验证的注解
1.建立注解类
image.png2.构建注解类
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyContraintValidator.class)
public @interface MyContraint {
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
1.@Target:权限使用区域
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前
2.Retention:注解生命周期
RetentionPolicy.SOURCE: 注解只保留在源文件中
RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
RetentionPolicy.RUNTIME: 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
3.@Constraint:validatedBy实现该注解逻辑的类
public class MyContraintValidator implements ConstraintValidator<MyContraint,Object> {
@Autowired
private HelloService helloService;
@Override
public void initialize(MyContraint constraintAnnotation) {
System.out.println("my validator init");
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
System.out.println(helloService.greeting("tom"));
System.out.println(value);
return false;
}
}
1.实现ConstraintValidator<T,E>接口,T:要实现的注解类,E:要注解的元素类型
2.方法体内能使用@Autowired注入其他类逻辑
3.在运行的时执行一次initialize方法,每次传入不同值时执行isValid方法,返回验证结果
4.添加字段校验注解必须的方法,并给予默认值,无默认值的需要在使用该注解时指定
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
5.在类中使用注解
public class User {
@NotBlank
String username;
@MyContraint(message = "自定义注解")
String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
6.在接收前端数据时用@Valid注解,并加上BindingResult类测试输出结果
@PostMapping("/greet")
public User greet(@Valid @RequestBody User user, BindingResult errors) {
System.out.println("进入方法");
if (errors.hasErrors()) {
errors.getAllErrors().stream().forEach(error ->{
System.out.println(error.getDefaultMessage());
});
}
System.out.println(user);
return user;
}
7.输出结果
image.png控制台执行结果打印
image.png
若结果出错返回值
出错的返回值
网友评论