11

抱歉,如果这个问题之前已经在某个地方讨论过。如果有请给我链接,我还没有找到满意的答案。

我一直在寻找一种方法来让我的 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

任何帮助将不胜感激。

克利

4

2 回答 2

15

嗯。恼人的!在我看来,您有 3 个选项:

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

  2. 您可以以@Min 的样式声明您自己的自定义注释(请参阅如何在此处执行自定义验证器)...

  3. .. 但是您需要的信息实际上保存在来自 Validator 实例的 ConstraintViolation 对象中。只是它没有被放入默认消息中。

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

  Set<ConstraintViolation<MyForm>> 违规 = validator.validate(form);
  for (ConstraintViolation<MyForm> cv : 违规) {
    类<?> annoClass = cv.getConstraintDescriptor().getAnnotation().getClass();
    if (Min.class.isAssignableFrom(annoClass)) {
      字符串 errMsg = MessageFormat.format(
        "{0}.{1} 的值为:{2} 但不得小于 {3}",
        cv.getRootBeanClass(),
        cv.getPropertyPath().toString(),
        cv.getInvalidValue(),
        cv.getConstraintDescriptor().getAttributes().get("值"));
            // 将 errMsg 作为错误返回到表单中
    }
  }
于 2011-03-08T04:11:58.727 回答
1

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

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

于 2011-03-08T04:02:45.110 回答