使javax验证错误消息更具体

时间:2011-03-07 23:55:08

标签: java bean-validation min

很抱歉,如果之前某个地方已经涵盖了这个问题。如果它已经请我链接,我还没有找到一个满意的答案。

我一直在寻找一种方法让我的javax验证提供的错误消息更具体。

我在@Min注释中拥有的消息在ValidationMessages.properties文件中指定:

javax.validation.constraints.Min.message=The value of this variable must be less than {value}.

并打印出预期的

The value of this variable must be less than 1

我想要的是消息还包括验证失败的变量(和类)的名称以及失败的变量的值。更像是。

The value of class.variable was 0 but not must be less than 1

非常感谢任何帮助。

克利

2 个答案:

答案 0 :(得分:13)

嗯。烦!在我看来,你有3个选择:

  1. 您可以编写自定义MessageInterpolator并将其替换为验证配置,但这似乎非常脆弱。

  2. 您可以在@Min(see how to do a custom validator here)的样式中声明自己的自定义注释...

  3. ..但您需要的信息实际上是在Validator实例中出现的ConstraintViolation对象中。只是它没有被置于默认消息中。

  4. 我猜你正在使用某种网络框架来验证表单。如果是这种情况,那么覆盖验证并执行类似的操作应该非常简单(快速的hacky版本,您应该能够通过使用外部属性文件使其非常整洁):

      Set<ConstraintViolation<MyForm>> violations = validator.validate(form);
      for (ConstraintViolation<MyForm> cv : violations) {
        Class<?> annoClass = cv.getConstraintDescriptor().getAnnotation().getClass();
        if (Min.class.isAssignableFrom(annoClass)) {
          String errMsg = MessageFormat.format(
            "The value of {0}.{1} was: {2} but must not be less than {3}",
            cv.getRootBeanClass(),
            cv.getPropertyPath().toString(), 
            cv.getInvalidValue(),
            cv.getConstraintDescriptor().getAttributes().get("value"));
                // Put errMsg back into the form as an error 
        }
      }
    

答案 1 :(得分:1)

我相信你需要创建一个自定义约束 您还没有提到您正在使用的规范的哪个实现,但是有关于如何为Hibernate Validator here创建自定义约束的良好文档。

部分过程将涉及创建自己的ValidationMessages.properties文件