【问题标题】:no error message when custom constraint gets violated违反自定义约束时没有错误消息
【发布时间】:2012-04-03 20:57:21
【问题描述】:

我的自定义约束有以下代码:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD })
@Constraint(validatedBy = MinMaxValidator.class)
public @interface CheckMinMax{

    String message() default "MinMax constraint has been violated";

    Class<? extends Payload>[] payload() default {};

    Class<?>[] groups() default {};

    int min() default 1;

    int max() default 10;
}

还有 Validator 类:

公共类 MinMaxValidator 实现 ConstraintValidator {

int max;
int min;

@Override
public void initialize(CheckMinMax annotation) {
    max = annotation.max();
    min = annotation.min();

}

@Override
public boolean isValid(Integer value, ConstraintValidatorContext arg1) {
    if (value < min || value > max)
        return false;
    return true;
}

}

现在,当我用我的注释对我的 entitybean 进行注释并尝试使用以下代码传入一个违反我的约束的对象时:

validator.validate(obj);

它可以工作,但没有错误消息... 这里有什么遗漏吗? 我该如何管理它以输出默认错误消息“MinMax 约束已被违反”?

谢谢

【问题讨论】:

    标签: java constraints bean-validation


    【解决方案1】:

    Validator.validate() 方法没有抛出 ConstraintValidationException。它返回Set&lt;ConstraintViolation&gt;,如果有任何约束违规,您有责任抛出异常。

    典型的使用模式是:

    Set<ConstraintViolation> cvs = validator.validate(obj);
    if(cvs.size() > 0){
      throw new ConstraintViolationException(cvs);
    }
    

    【讨论】:

    • 您好,感谢您的回答。该集合需要一个类型参数。 Set> cvs;但是 ConstraintViolationException 的构造函数不接受它。 (构造函数 ConstraintViolationException(Set>) 未定义):/
    【解决方案2】:

    我想出了如何打印出注释中定义的错误消息:

    Set<ConstraintViolation<TypeOfObj> cvs = validator.validate(obj);
    for(ConstraintViolation<TypeOfObj> violation : cvs) 
    {
        logger.info(violation.getMessage());
    }
    

    干杯

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      相关资源
      最近更新 更多