适用场景:
同一个实体类(User)在多个地方用到,但是属性password只能设置为符合指定规则的字符,此时我们有pc和app端两处入口可以维护user的这个attribute,假设两处入口走不同的业务逻辑,我们在没处logic都需要对password进行check,万一哪天这个role修改了,我们对使用logic的地方也要进行单一修改,费时容易修改不全。这种情况下我们可以选择通过@interface的方式进行check,这样相同的role只需要修改一次就ok。
//定义注解要执行的方法
/**
*自定义的注解执行方法
*/
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
//实现接口,自动注入为bean
public class MyConstraintValidation implements ConstraintValidator<MyConstraint, Object> {//<MyConstraint, Object> 绑定注解MyConstraint,指定类型Object为任意类型
//此处可通过@autowired注入任何bean中已有的内容
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
//指定的逻辑
System.out.println("执行指定的逻辑,false校验不过,true校验通过");
System.out.println("value"+value);
System.out.println("context"+context);
return false;
}
}
//创建自定义注解
/**
*自定义注解
*/
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
//自定义注解类
@Target({ElementType.METHOD,ElementType.FIELD})//标识注释到哪里,方法和字段,可以根据需求设定
@Retention(RetentionPolicy.RUNTIME)//运行时注解
@Constraint(validatedBy=MyConstraintValidation.class)//注解执行的校验类
public @interface MyConstraint {
//这三个方法必须要有
String message();//提示信息
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
使用到实体类上
import java.util.Date;
import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonView;
import com.ztx.voladitor.MyConstraint;
public class User {
private int id;
//此注解为自定义注解 设置message为如果校验不过要return的message
@MyConstraint(message="username")
private String username;
@NotBlank
private String password;
private Date birthday;
public interface UserSimpleView {};
public interface UserDetailView extends UserSimpleView {};
@JsonView(UserSimpleView.class)//UserSimpleView试图下显示
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@JsonView(UserSimpleView.class)//UserSimpleView试图下显示
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@JsonView(UserSimpleView.class)//UserSimpleView试图下显示
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@JsonView(UserDetailView.class)//视图下显示
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/方法中使用
@JsonView(User.UserSimpleView.class)
//@RequestMapping(value="/user",method = RequestMethod.GET)
@PostMapping
public User create(@Valid @RequestBody User user,BindingResult errors) {//校验实体类中的@NotBlank类似注解
if(errors.hasErrors()) {
//有错误会打印,
errors.getAllErrors().stream().forEach(error -> System.out.println(error.getDefaultMessage()));
}
System.out.println(user.getPassword());
System.out.println(user.getUsername());
System.out.println(user.getId());
System.out.println(user.getBirthday());
user.setId(1);
return user;
}