很抱歉,如果之前某个地方已经涵盖了这个问题。如果它已经请我链接,我还没有找到一个满意的答案。
我一直在寻找一种方法让我的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
非常感谢任何帮助。
克利
答案 0 :(得分:13)
嗯。烦!在我看来,你有3个选择:
您可以编写自定义MessageInterpolator并将其替换为验证配置,但这似乎非常脆弱。
您可以在@Min(see how to do a custom validator here)的样式中声明自己的自定义注释...
..但您需要的信息实际上是在Validator实例中出现的ConstraintViolation对象中。只是它没有被置于默认消息中。
我猜你正在使用某种网络框架来验证表单。如果是这种情况,那么覆盖验证并执行类似的操作应该非常简单(快速的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文件