2011-03-07 24 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