2012-08-02 47 views
3

我正在为特定的约束组(不是默认)编写自定义验证器,但运行时给了我下面的错误。为什么JSR303自定义注释的约束组默认为空数组?

我只是好奇他们为什么需要默认值为空。感谢您分享您的意见。谢谢:)

xxx.model.validation.CustomValidation包含约束注释,但groups参数的默认值不是空数组。

堆栈跟踪:org.hibernate.validator.metadata.ConstraintHelper.assertGroupsParameterExists(ConstraintHelper.java:335) org.hibernate.validator.metadata.ConstraintHelper.isConstraintAnnotation(ConstraintHelper.java:282)

回答

2

我不能弄清楚在哪种情况下,将约束绑定到特定组可能很有用。

一个组用于部分验证(和序列验证)。如果一个班级中有10个字段,则可以用A和2与B来标记其中的8个字段。然后,您可以决定仅验证A组或B组中的字段。相反,您希望@MyConstraint属于名为C的特定组。这个不成立。一个组或多或少是一个名字,用来区分同一班级的其他领域。它没有绝对的意义。组在验证时不用在约束定义中很有用,它们与字段而不是约束有关。

此外,如果您在约束定义中隐藏了组名称,则可能会遇到错误,因为您可以认为这些字段已全部验证为已验证。

@Email 
private String mail; 

@Password 
private String pass; 

@VAT 
private String vatCode; 

你能看到是否有部分验证?

编辑

关于第二个评论: 假设你有5场一类无约束的。其中三个是整数。如果要验证这三个字段的总和,则必须按照您的建议创建类级约束。通过这种方式,您的自定义注释应用于类而不是字段,那么您如何在字段上定义组?

相反,你可以使用这样的事情:

@Sum(min = 250, fields = {"length", "width", "height"}) 
public class MyClass { 
    private String type; 
    private String code; 
    private int length; 
    private int width; 
    private int height; 
     ... 
} 
+0

感谢阿尔夫。关于**的最后一点“在约束定义中隐藏了组名,可能会遇到错误”**足够有效。如果@VAT是默认组与Default不同的自定义约束,则确实难以区分 - 因此会导致混淆和错误。 – 2012-08-03 01:52:45

+0

虽然我不是很了解你的第一点。我有A组,B组代表不同的验证规则。但是对于B组,我需要在多个字段上执行一些自定义验证(例如,它们的总和必须高于某个最小值),因此我在模型本身上编写了一个自定义验证器/约束(即Target:ElementType.TYPE)。这个自定义验证器对B组是唯一的,因此我试图把B作为默认约束组。 – 2012-08-03 02:03:43

+0

@TheHuy,看我的编辑 – Alf 2012-08-03 08:00:41