可参数化的JSR-303validation值

我使用JSR-303 beanvalidation和Spring 3,我需要根据用例为注释提供不同的值。

例如, @Size(min=?)min参数的值对于某些validation必须为1,对于另一种情况必须为5,并且我想从属性文件中读取此值。

我知道可以从ValidationMessages.properties文件中读取message参数(如果作为键提供)但是另一个参数呢?

如dpb所述,您可以使用validation组来指定具有不同属性值的相同约束。

如果您正在使用Hibernate Validator作为BV实现,那么您可以使用编程API而不是注释来定义约束。 这样你就可以在运行时检索具体的约束值,如下所示:

 int minValue1 = ...; //read from properties file etc. int minValue2 = ...; //programmatically define the constraints for the Test type ConstraintMapping mapping = new ConstraintMapping(); mapping.type( Test.class ) .property( "prop", FIELD ) .constraint( new NotNullDef() ) .constraint( new SizeDef().min( minValue1 ).groups( GroupOne.class ) ) .constraint( new SizeDef().min( minValue2 ).groups( GroupTwo.class ) ); //retrieve a validator using the programmatic constraint mapping HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure(); config.addMapping( mapping ); ValidatorFactory factory = config.buildValidatorFactory(); Validator validator = factory.getValidator(); 

注释参数的值只能是编译时表达式。 这意味着对于@Size(min=X, max=Z) X和Z必须在编译时可解析。

由于在@Size minmax声明为int@Size您将被卡住。

如果你需要不同的min值, 我个人会看到两种方法

首先 ,您可以对validation器使用分组。 min=1使用一组, min=1使用一组。 例如,让我们考虑一个Test类:

 public class Test { @NotNull @Size.List({ @Size(min = 1, groups = GroupOne.class), @Size(min = 5, groups = GroupTwo.class) }) private String prop; public String getProp() { return prop; } public void setProp(String prop) { this.prop = prop; } } 

您必须声明组:

 public interface GroupOne {} public interface GroupTwo {} 

然后创建一些测试对象加上validation器来使用它:

 Test test = new Test(); test.setProp("XY"); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); 

然后使用组validation:

 Set> resultOne = validator.validate(test, GroupOne.class); Set> resultTwo = validator.validate(test, GroupTwo.class); 

第一种情况是有效的,因为min=1"XY".length() == 2但是第二种情况会因为min=5失败。

这个方法涉及手动进行validation,我认为你不能仅仅依靠@Valid@RequestMapping注释的方法进行validation(因为@Valid只是validation的触发器而没有提到所需的组。validation)。 幸运的是Spring非常灵活,自己调用validation器也不会有太大的开销。

我看到的第二个选项涉及使用自定义validation器创建自己的validation注释以进行匹配。 在这里,您可以找到一个简单的示例来帮助您入门 。 使用此解决方案,您可以将minmax声明为validation程序在validation之前将在解决方案中解析的字符串键。 虽然这个解决方案比第一个解决方案更开销。