2011-03-07 30 views
11

对不起,如果这个问题已经覆盖了某个地方之前。如果它有请联系我,我还没有找到一个满意的答案。使javax验证错误消息更具体

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

任何帮助将不胜感激。

Klee

回答

13

嗯。烦!当我看到它,你有3种选择:

  1. 你可以写一个自定义的MessageInterpolator并代入您的验证配置,但是这似乎真的脆。

  2. 你可以在最风格@Min(see how to do a custom validator here)的声明你自己定制标注...

  3. 。但你需要的信息散发出来的的ConstraintViolation对象中实际持有Validator实例。这只是它不会被放入默认消息。

我猜你正在使用某种web框架来验证表单。如果是这种情况,应该很简单地覆盖验证并执行类似的操作(快速的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

我相信你需要创建一个自定义约束。
你没有提到你正在使用的规范的实现,但是有关于如何为Hibernate验证器here创建自定义约束的好文档。该过程的

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