2013-06-04 205 views
2

如何在類級驗證程序中返回不同的消息?Java bean驗證 - 覆蓋默認消息

接口

public @interface ValidFoo 
{ 
    public String message() default "{package.ValidFoo.message}"; 
} 

實施

@Override 
public boolean isValid(final Foo foo, final ConstraintValidatorContext context) 
{ 
    // check constraint 1 
    // --> return message "package.ValidFoo.message_constraint1" 

    // check constraint 2 
    // --> return message "package.ValidFoo.message_constraint2" 
} 

ValidationMessages.properties

package.ValidFoo.message=Validation error. 
package.ValidFoo.message_constraint1=Validation error 1. 
package.ValidFoo.message_constraint2=Validation error 2. 

回答

9

您需要使用ConstraintValidatorContext來選擇正確的消息模板。您可以在Hibernate Validator文檔中看到一個示例 - http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints-validator

切實你做這樣的事情:

constraintContext.disableDefaultConstraintViolation(); 
    constraintContext.buildConstraintViolationWithTemplate(
      "{package.ValidFoo.message_constraint1}" 
    ) 
    .addConstraintViolation(); 
+0

你也知道,如果有可能添加郵件屬性在運行時格式化('「{0}」')?似乎只能使用接口定義中的硬編碼屬性,而不能更新這些屬性。 – djmj

+0

在Bean Validation 1.0中,只允許使用靜態變量。 Hibernate Validator也允許插入驗證值本身。這也使得它也進入了Bean Validation 1.1規範更新。這不允許添加任何動態變量。我們可能很快會在Hibernate Validator中實現這樣的功能 - https://hibernate.atlassian.net/browse/HV-701。隨時留下對這個問題的評論來描述你的用例。 – Hardy

+0

在許多類級約束中,此功能很有幫助,因爲驗證可以依賴於動態屬性。另一個用例是簡單的憑證檢查。例如,狀態{0}中的Order不能由類型爲{1}的客戶端更新。「在這種情況下,類型也必須以某種方式傳遞給驗證器實例,除非它是Order本身的屬性,這看起來是一種糟糕的解決方法。所以我必須手動驗證此案例才能創建正確的消息或使用通用消息。 '在當前狀態下更新訂單的憑證無效.'。 – djmj