【问题标题】:Custom Bean Validator -- JSR303/JSR349 can Validator choose message when invalid?自定义 Bean Validator -- JSR303/JSR349 Validator 可以在无效时选择消息吗?
【发布时间】:2013-07-20 15:37:14
【问题描述】:

有没有办法让验证器在验证失败时指定消息?我知道我可以实现注释,所以我可以像这样使用它(实际上可能会使用枚举而不是 value 的字符串):

@Check(value="Type1", message="{type1.checkFailed}") public MyClass myVal1;
@Check(value="Type2", message="{type2.checkFailed}") public MyClass myVal2;

这将得到我想要的最终结果。我还可以实现多个注解/验证器并这样做,并在注解的定义中指定默认消息:

@CheckType1 public MyClass myVal1; // default message is type1.checkFailed
@CheckType2 public MyClass myVal2; // default message is type2.checkFailed

我想做的是让与@Check关联的验证器确定是使用type1.checkFailed还是type2.checkFailed作为消息,取决于value,像这样:

@Check("Type1") public MyClass myVal1;
@Check("Type2") public MyClass myVal2;

据我了解,最佳做法是让验证者专注于单一特征。但我不认为我正在尝试做的是与此相反,因为它是对单个特征的验证,只有它的变体可以被验证。

以犬种为例:

@BreedSize("Large") Dog bigDog;
@BreedSize("Small") Dog smallDog;

由于给定的注释只能在一个元素上出现一次(至少从 SE7 开始),这也可能是确保仅发生几个互斥验证中的一个的合理方法。我认为有/正在提议在一个元素上使用多个相同类型的注释,但我想验证器可以检查是否只提供了一个,在这种情况下——不过在这里领先。

这可能吗?

【问题讨论】:

    标签: bean-validation


    【解决方案1】:

    您可以通过将ConstraintValidatorContext 传递给isValid() 方法来创建自定义约束违规对象,如下所示:

    public class BreedSizeValidator implements ConstraintValidator<BreedSize, Dog> {
    
        private String value;
    
        @Override
        public void initialize(BreedSize constraintAnnotation) {
            this.value = constraintAnnotation.value();
        }
    
        @Override
        public boolean isValid(
            Dog object,
            ConstraintValidatorContext constraintContext) {
    
            if ( object == null ) {
                return true;
            }
    
            boolean isValid = ...;
    
            if ( !isValid ) {
                String messageKey = "Large".equals( value ) ? 
                    "{BreedSize.Large.message}" : "{BreedSize.Small.message}";
    
                constraintContext.disableDefaultConstraintViolation();
                constraintContext
                    .buildConstraintViolationWithTemplate( messageKey )
                    .addConstraintViolation();
            }
    
            return isValid;
        }
    }
    

    【讨论】:

    • 效果很好!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多