主要的方法是使用传递的ConstraintValidatorContext对象可以添加额外的错误消息,或者完全禁用默认的错误信息而使用完全自定义的错误信息。
至于简单的通过注解定义默认的错误信息模板可以查看其他牛人的博客。但是有时候在自定义的Validator校验器中不单单只是类似非空判断这些简单的校验,有可能发生一些常见的情况如:在类校验器重需要同时校验该类中的多个属性等,这样的话一个默认的错误信息模板无法精确反馈对应错误信息(如在这个类中就是那个属性校验失败等)给用户,所以这里就简单的介绍一下在Validator校验器中重新定义默认的错误信息模板来反馈准确的错误信息。
方便展示,首先自定义一个注解 CannotContainSpaces
- import java.lang.annotation.Documented;
- import java.lang.annotation.Retention;
- import java.lang.annotation.Target;
- import javax.validation.Constraint;
- import javax.validation.Payload;
- @Constraint(validatedBy = CannotContainSpacesValidator.class) //具体的实现
- @Target( { java.lang.annotation.ElementType.METHOD,
- java.lang.annotation.ElementType.FIELD })
- @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
- @Documented
- public @interface CannotContainSpaces {
- String message() default "{Cannot.contain.Spaces}"; //提示信息,可以写死,可以填写国际化的key
- int length() default 5;
- //下面这两个属性必须添加
- Class<?>[] groups() default {};
- Class<? extends Payload>[] payload() default {};
- }
具体的实现类 CannotContainSpacesValidator.java
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- public class CannotContainSpacesValidator implements ConstraintValidator<CannotContainSpaces, String> {
- private int len;
- /**
- * 初始参数,获取注解中length的值
- */
- @Override
- public void initialize(CannotContainSpaces arg0) {
- this.len = arg0.length();
- }
- @Override
- public boolean isValid(String str, ConstraintValidatorContext constraintValidatorContext) {
- if(str != null){
- if(str.indexOf(" ") < 0){
- return true;
- }
- }else{
- constraintValidatorContext.disableDefaultConstraintViolation();//禁用默认的message的值
- //重新添加错误提示语句
- constraintValidatorContext
- .buildConstraintViolationWithTemplate("字符串不能为空").addConstraintViolation();
- }
- return false;
- }
- }
使用的时候直接注解到对象的属性上面就可以了
- @CannotContainSpaces
- private String name;
从上面代码展示的情况可以看到,其实非常简单,通过ConstraintValidatorContext就可以对默认的错误信息模板进行修改。
当然,如果想调用配置文件中所定义好的错误信息也是可以的
- //重新添加错误提示语句
- constraintValidatorContext
- .buildConstraintViolationWithTemplate("{StringNotBlank}").addConstraintViolation();
只需要在对应的配置文件中增加其定义就好了
ValidationMessages.properties
- StringNotBlank=字符串不能为空
至于配置文件的调用是在Spring框架的配置文件中进行对应的配置,许多牛人的博客中都有介绍,这里就不详细说明了。