注解参数的值只能是编译时表达式。这意味着对于@Size(min=X, max=Z),X 和 Z 必须在编译时可解析。
由于min 和max 在@Size 上被声明为int,所以你被卡住了。
如果您需要 min 的不同值,我个人认为有两种方法。
首先,您可以对验证器进行分组。一组用于min=1,一组用于min=5。例如,让我们考虑一个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 {}
然后创建一些测试对象以及与之配套的验证器:
Test test = new Test();
test.setProp("XY");
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
然后使用组进行验证:
Set<ConstraintViolation<Test>> resultOne = validator.validate(test, GroupOne.class);
Set<ConstraintViolation<Test>> resultTwo = validator.validate(test, GroupTwo.class);
第一种情况有效,因为min=1 和"XY".length() == 2,但第二种情况会失败,因为min=5。
此方法涉及手动进行验证,我认为您不能仅依靠 @Valid 上的 @RequestMapping 注释方法进行验证(因为 @Valid 只是验证的触发器,没有办法提及验证所需的组)。幸运的是 Spring 非常灵活,自己调用验证器不会有太多开销。
我看到的第二个选项涉及使用自定义验证器创建自己的验证注释以进行匹配。 Here you can find a simple example to get you started。使用此解决方案,您可以将 min 和 max 声明为字符串键,您的验证器将在验证之前在包中解析它们。这个解决方案虽然比第一个解决方案开销更大。