1、环境
- SpringBoot 2.2.2.RELEASE
- 依赖
validation-api
(这里只是引入该功能的依赖)
<dependency>
<groupId>javax.validationgroupId>
<artifactId>validation-apiartifactId>
<version>2.0.1.Finalversion>
dependency>
2、编写一个自定义的检验注解
- 编写一个
@interface
的类,我这里用ValidValue作为示例。
- 下面三个是
JSR303
中规定必须有的
String message() default "The specified value must be submitted";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
- 设定规则
int[] vals() default {};
,就是你想要用来校验的规则。这里表示你输入的数字必须满足在该数组中。
- 完整例子如下(如果你不知道类上面的注解用那些,你可以随便点进去一个检验注解复制过去)
- 在这里面的
ValidValueConstraintValidator
校验器(下面说),是需要和你的校验注解绑定的
@Documented
@Constraint(
validatedBy = {ValidValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidValue{
String message() default "The specified value must be submitted";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default {};
}
3、编写一个自定义的检验器
- 需要定义一个校验器
A extends Annotation 指定注解 (就是你上面自定义注解的名字)
T 指定类型 ,就是你需要校验的变量的类型
public class ValidValueConstraintValidator implements ConstraintValidator<ValidValue,Integer> {
private Set<Integer> set = new HashSet<>();
@Override
public void initialize(ValidValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
if(vals != null){
for (int val : vals) {
set.add(val);
}
}
}
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(integer);
}
}
- 关联自定义的检验器个自定义的校验注解
- 即是在你的自定义校验注解上面的
@Constraint
绑定你的自定义校验器
@Constraint(
validatedBy = {ValidValueConstraintValidator.class}
)
4、在你的controller 上面添加注解
@Valid
表示传入的值需要校验
BindingResult result
,可以获取其中的错误信息
@ResponseBody
@RequestMapping("/test")
public Map<String,String> test(@Valid String showStatus ,BindingResult result){
if (result.hasErrors()){
Map<String,String> map = new HashMap<>();
result.getFieldErrors().forEach((item)->{
String message = item.getDefaultMessage();
String field = item.getField();
map.put(field,message);
})
}
return map ;
}
4、测试
- 在你需要校验的变量上面加上你的注解即可
@ValidValue(vals = {0,1})
,表示你输入的数字必须是0或者1,如果是其他数字就会报错
@ValidValue(vals = {0,1})
private Integer showStatus;
{
"showStatus": "The specified value must be submitted",
}
5、如何自定义返回的错误信息
- jar包提供的注解中,他们的错误信息都放在了jar包里面的
ValidationMessages.properties
中,可以全局搜索ValidationMessages
可以看到。
- 例如
javax.validation.constraints.AssertFalse.message = must be false
javax.validation.constraints.AssertTrue.message = must be true
javax.validation.constraints.DecimalMax.message = must be less than ${inclusive == true ? 'or equal to ' : ''}{value}
javax.validation.constraints.DecimalMin.message = must be greater than ${inclusive == true ? 'or equal to ' : ''}{value}
javax.validation.constraints.Digits.message = numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected)
javax.validation.constraints.Email.message = must be a well-formed email address
javax.validation.constraints.Future.message = must be a future date
javax.validation.constraints.FutureOrPresent.message = must be a date in the present or in the future
javax.validation.constraints.Max.message = must be less than or equal to {value}
javax.validation.constraints.Min.message = must be greater than or equal to {value}
javax.validation.constraints.Negative.message = must be less than 0
javax.validation.constraints.NegativeOrZero.message = must be less than or equal to 0
javax.validation.constraints.NotBlank.message = must not be blank
javax.validation.constraints.NotEmpty.message = must not be empty
javax.validation.constraints.NotNull.message = must not be null
- 所以我们自己编写一个
ValidationMessages.properties
文件,放在resources目录下
com.study.common.valid.ValidValue.message
是你自定义的注解加上.message
com.study.common.valid.ValidValue.message=输入的数字必须不规范
String message() default "{com.study.common.valid.ListValue.message}";