2010-04-18 44 views
8

我正在尋找使用Hibernate驗證器來滿足我的要求。我想驗證一個JavaBean,其中屬性可能有多個驗證檢查。例如:在Hibernate驗證器中爲每個屬性生成錯誤代碼

class MyValidationBean 
{ 
    @NotNull 
    @Length(min = 5, max = 10) 
    private String myProperty; 
} 

但是,如果該物業的驗證失敗我希望有一個特定的錯誤代碼與ConstraintViolation相關,無論它是否失敗,因爲@Required或@Length的,但我想保留錯誤信息。

class MyValidationBean 
{ 
    @NotNull 
    @Length(min = 5, max = 10) 
    @ErrorCode("1234") 
    private String myProperty; 
} 

像上面這樣的東西會很好,但它不必像這樣構造。我看不到用Hibernate Validator做這件事的方法。可能嗎?

回答

0

從本說明書的部分4.2. ConstraintViolation

getMessageTemplate方法返回非內插的錯誤信息(通常在約束聲明的message屬性)。框架可以將其用作錯誤代碼鍵。

我認爲這是您的最佳選擇。

+1

感謝您的回覆。不幸的是,我不認爲這會保留我想要的原始錯誤信息。我正在尋找額外的錯誤代碼。可悲的是看着ConstraintViolation的API,我並沒有看到任何看起來很有希望的東西。 – 2010-04-19 19:11:25

0

我想要做的就是隔離應用程序的DAO層上的這種行爲。使用

您的例子中,我們將有:

public class MyValidationBeanDAO { 
    public void persist(MyValidationBean element) throws DAOException{ 
     Set<ConstraintViolation> constraintViolations = validator.validate(element); 
     if(!constraintViolations.isEmpty()){ 
      throw new DAOException("1234", contraintViolations); 
     } 
     // it's ok, just persist it 
     session.saveOrUpdate(element); 
    } 
} 

及以下異常類:

public class DAOException extends Exception { 
private final String errorCode; 
private final Set<ConstraintViolation> constraintViolations; 

public DAOException(String errorCode, Set<ConstraintViolation> constraintViolations){ 
    super(String.format("Errorcode %s", errorCode)); 
    this.errorCode = errorCode; 
    this.constraintViolations = constraintViolations; 
} 
// getters for properties here 
} 

您可以添加基於什麼財產還沒有從這裏經過驗證的一些註釋信息,但總是做這在DAO方法上。

我希望這有助於。

4

您可以創建一個自定義註釋來獲取您正在查找的行爲,然後驗證並使用反射來提取註釋的值。像下面這樣:

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ErrorCode { 
    String value(); 
} 

在你的bean:

@NotNull 
@Length(min = 5, max = 10) 
@ErrorCode("1234") 
public String myProperty; 

在驗證你的bean:

Set<ConstraintViolation<MyValidationBean>> constraintViolations = validator.validate(myValidationBean);  
for (ConstraintViolation<MyValidationBean>cv: constraintViolations) { 
    ErrorCode errorCode = cv.getRootBeanClass().getField(cv.getPropertyPath().toString()).getAnnotation(ErrorCode.class); 
    System.out.println("ErrorCode:" + errorCode.value()); 
} 

說了這麼多,我可能會質疑想要錯誤代碼爲這些要求消息的類型。

+0

這是一個很好的解決方案,非常感謝張貼。只需注意一點。代碼應該讀取getDeclaredField以使其能夠訪問專用字段。 – MandyW 2013-07-29 20:16:01