【发布时间】:2014-09-09 23:59:45
【问题描述】:
我在 Spring MVC 控制器中的 bean 上使用约束验证器 (JSR-303)。给定以下 java bean:
public class EntityDTO {
protected Long id;
protected Integer version;
protected String someOtherField;
// getters and setters
}
我想要执行 2 种不同类型的约束验证。 id 和 version 要么都是 null,要么都是非 null。
我可以创建 2 个不同的约束验证器并分配给 2 个不同的注释:DTOEntityFieldsEmpty 和 DTOEntityFieldsNotEmpty。但是我必须在 bean 级别指定验证器注释。
@DTOEntityFieldsEmpty
public class EntityDTO {
....
}
但是,我希望指定要在实际控制器方法级别中使用的验证器。一般情况下,我的方法是:
public void updateData( @RequestBody @Valid EntityDTO dto){
...
}
@Valid 注释将应用在 EntityDTO 对象中定义的验证器。但我正在寻找是否有一种方法可以在 @Valid 请求中传递参数,或者指定要使用的验证器。
// @Valid annotation not supported this way
public void updateData( @RequestBody @Valid(validator=DTOEntityFieldsEmpty.class) EntityDTO dto){
...
}
我能做些什么来解决这个问题吗?我意识到我可以使用 Spring 的 @InitBinder,但这会将验证器绑定到整个 Controller,而不仅仅是一个特定的方法。
我已经检查了 JSR-303 1.0 和 1.1,并没有看到任何让我跳出来处理这种情况的东西。同样,我在 Spring 3 或 4 文档中也找不到任何内容。我想知道是否有办法使用组验证,但不完全确定。我需要能够知道控制器中哪个验证器成功或失败,这对我来说似乎有点 hacky。
【问题讨论】:
标签: java spring validation spring-mvc