常用的验证注解
@Valid 被注释的元素是一个对象,需要检查此对象的所有字段值
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
更多注解参考:Hibernate Validator注解大全
自定义消息
原始消息:拼接式,即字段名+注解自带的消息提示
@PutMapping("/user/{id:\\d+}")
public User update(@PathVariable("id") String id,@Valid @RequestBody User user, BindingResult errors){
if (errors.hasErrors()){
errors.getAllErrors().stream().forEach( error -> {
// FieldError fieldError = (FieldError)error;
// String message = fieldError.getField()+" "+error.getDefaultMessage();
// System.out.println(message);
System.out.println(error.getDefaultMessage());
});
}
user.setId(id);
user.setUsername(user.getUsername());
return user;
}
效果如下图所示
自定义消息:给注解的 message 赋值,如下图:
自定义校验注解
- 定义一个注解
自定义注解 @MyConstraint
,在message()
的 default "这是我自定义的校验注解"
可以自定义消息,如果在使用注解的地方没有给 message 赋值的话,使用的默认消息就是这里的 default 的值
package com.echo.security.validator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author: yuju
* @Date: 2018/5/16 - 18:06
*/
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME) //retention : 保留,保持
@Constraint(validatedBy = MyConstraintValidator.class) //表示当前注解要用什么类来执行
public @interface MyConstraint {
String message() default "{javax.validation.constraints.Past.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 写注解的实现类
自定义的类MyConstraintValidator
实现了接口javax.validation.ConstraintValidator
package com.echo.security.validator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @Author: yuju
* @Date: 2018/5/16 - 18:12
*/
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object>{
@Override
public void initialize(MyConstraint constraintAnnotation) {
}
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
System.out.println(o);
return false;
}
}
以下是javax.validation.ConstraintValidator
的源码:,从ConstraintValidator
的源码可以看出,实现该接口要实现一个方法isValid()
,校验规则可以写在这个方法里。传入的泛型为注解MyConstraint
和Object
,表示这个注解可以用于所有类型(object)上
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package javax.validation;
import java.lang.annotation.Annotation;
public interface ConstraintValidator<A extends Annotation, T> {
default void initialize(A constraintAnnotation) {
}
boolean isValid(T var1, ConstraintValidatorContext var2);
}