我在 Spring MVC Controller 中的 bean 上使用约束 validator (JSR-303)。给定以下 Java bean:
public class EntityDTO {
protected Long id;
protected Integer version;
protected String someOtherField;
// getters and setters
}
我想要执行两种不同类型的约束验证。 id
和 version
要么都为 null,要么都为非 null。
我可以创建 2 个不同的约束 validator 并分配给 2 个不同的注释:DTOEntityFieldsEmpty
和 DTOEntityFieldsNotEmpty
。但随后我必须在 bean 级别指定 validator 注释。
@DTOEntityFieldsEmpty
public class EntityDTO {
....
}
但是,我希望指定要在实际 Controller 方法级别中使用的 validator 。一般情况下,我的方法是:
public void updateData( @RequestBody @Valid EntityDTO dto){
...
}
其中 @Valid
注释将应用 EntityDTO 对象中定义的 validator 。但我想看看是否有一种方法可以在 @Valid 请求中传递参数,或者指定要使用的 validator 。
// @Valid annotation not supported this way
public void updateData( @RequestBody @Valid(validator=DTOEntityFieldsEmpty.class) EntityDTO dto){
...
}
我能做些什么来解决这个问题吗?我意识到我可以使用 Spring 的 @InitBinder
,但这会将 validator 绑定(bind)到整个 Controller ,而不仅仅是一个特定的方法。
我检查了 JSR-303 1.0 和 1.1,没有发现任何可以处理这种情况的内容。同样,我在 Spring 3 或 4 文档中也找不到任何内容。我想知道是否有办法使用组验证,但不完全确定。我需要能够知道 Controller 中哪个 validator 成功或失败,这对我来说似乎有点老套。
最佳答案
您可以使用Validation Groupes 。因此,您需要将字段处的约束分配给组,然后您需要告诉 spring 验证哪个组(这可以是一个或多个组),因此 Spring 3.1 introduced the @Validated
annotation .
public interface GroupA { } //empty marker interface
public interface GroupB { }
@DTOEntityFieldsEmpty(groups=GroupA.class)
@DTOEntityFieldsNotEmpty(groups=GroupB.class)
public class EntityDTO {
....
}
public void updateData(
@RequestBody @Validated({ GroupA.class }) EntityDTO dto){
...
}
关于java - Spring MVC : use different JSR-303 validators on the same bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24831917/