2012-07-11 57 views
8

我正在使用Hibernate Validator 4.2.0.Final,我正在尋找最簡單的方法在我的錯誤消息中包含類字段名稱。使用Hibernate驗證器在錯誤消息中包含字段名稱

我發現的是以下線程Using a custom ResourceBundle with Hibernate Validator。根據這個我應該創建我的自定義註釋每個約束註釋添加一個屬性到每個。

有沒有更清晰的方法來實現這一目標?

以下代碼:

@Size(max = 5) 
private String myField; 

產生默認的錯誤:大小必須在0和5之間

我想它是:MyField的大小必須介於0和5。

在此先感謝。

回答

0

對於所有正在尋找一種方法來訪問驗證器中的類。將hibernate註釋放在類級別而不是變量級別上可讓您訪問類對象(假設您已定義自定義驗證器)。

public class myCustomValidator implements ContraintValidator <MyAnnotation, MyAnnotatedClass> { 

    public void initialize (...){ ... }; 

    public boolean isValid (MyAnnotatedClass myAnnotatedClass) { 

     // access to elements of your myAnnotatedClass 

    } 
} 
2

我不知道任何通用的方法,但您可以定義自定義錯誤消息並在其中包含字段名稱。

@Size(max = 5, message = "myField size must be between 0 and 5") 
private String myField; 
+2

沒有國際化的方式。 – dbreaux 2013-02-20 15:47:42

0

使用oval這有很多註釋和可能的顯示消息的方法。

14

您可以從ConstraintViolation classgetPropertyPath()方法得到的字段的名稱。

一個好的默認的錯誤消息可以是:

violation.getPropertyPath() + " " + violation.getMessage(); 

,這將給你「富未必空」,或「foo.bar可能不空」在嵌套對象的情況。

+0

這對我來說是完美的兄弟。謝謝。 – 2014-02-09 07:26:21

+0

這是常用的模式。 – okwap 2014-02-24 06:36:03

+0

如何獲取特定的字段名稱 – DEADEND 2017-03-17 10:00:55

0

我把每場驗證消息到屬性文件中,就像這樣:

field.student.name.size.message = Student name size is not valid. 

,並在豆,使用這樣的:

@Size(max = 5, message = "${field.student.name.size.message}") 
private String myField; 

我知道這是不是一個完美的解決方案,但我也找不到更好的方法。

0

使用這種方法(當然是ConstraintViolationException實例):

Set<ConstraintViolation<?>> set = ex.getConstraintViolations(); 
List<ErrorField> errorFields = new ArrayList<>(set.size()); 
ErrorField field = null; 
for (Iterator<ConstraintViolation<?>> iterator = set.iterator();iterator.hasNext();) { 
    ConstraintViolation<?> next = iterator.next(); 
    System.out.println(((PathImpl)next.getPropertyPath()) 
      .getLeafNode().getName() + " " +next.getMessage()); 


}