可参数化的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
min
和max
声明为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注释以进行匹配。 在这里,您可以找到一个简单的示例来帮助您入门 。 使用此解决方案,您可以将min
和max
声明为validation程序在validation之前将在解决方案中解析的字符串键。 虽然这个解决方案比第一个解决方案更开销。