2012-07-11 159 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()); 


}