话不多说 纯干货
新建一个自定义注解 MyConstraint
//注解的作用域可以在很多地方 这里可以放在方法和属性上
@Target({ElementType.METHOD, ElementType.FIELD})
//基于运行时的注解
@Retention(RetentionPolicy.RUNTIME)
//javax validation标准校验器 括号里的类表示当前这个属性需要用什么类去进行校验(该类中包含校验逻辑)
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
/**
* 这三个属性是hibernate validator中其他注解都包括的 我们也写上 但这里只用到message
* @return
*/
String message();
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
新建一个类 MyConstraintValidator
/**
* 这里必须要实现ConstraintValidator接口 只要实现了此接口 spring就会接管该类的创建
* 第一个参数MyConstraint 表示要实现的注解是什么
* 第二个参数Object 表示该注解可以作用在哪些需要被验证的类型上
*/
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
/**
* 这里可以注入一些需要判断逻辑的服务类
*/
@Autowired
private XXX xxx;
@Override
public void initialize(MyConstraint constraintAnnotation) {
System.out.println("我被初始化了");
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
//xxx 执行某些方法 然后进行逻辑判断 最后返回true或者false
return true;
}
}
以上的注解用法就不多做介绍了
这里附加一点在web层的简单用法
@PostMapping("/login")
public Rsp login(@Valid @RequestBody LoginInfo loginReq, BindingResult result) {
Rsp rsp = new Rsp();
if (result.hasErrors()) {
return rsp.fail(result.getFieldError().getDefaultMessage());
}
...
...
...
}
网友评论