java - Spring MVC : use different JSR-303 validators on the same bean?

标签 java spring validation spring-mvc

我在 Spring MVC Controller 中的 bean 上使用约束 validator (JSR-303)。给定以下 Java bean:

public class EntityDTO {

    protected Long id;
    protected Integer version;
    protected String someOtherField;

    // getters and setters
}

我想要执行两种不同类型的约束验证。 idversion 要么都为 null,要么都为非 null。

我可以创建 2 个不同的约束 validator 并分配给 2 个不同的注释:DTOEntityFieldsEmptyDTOEntityFieldsNotEmpty。但随后我必须在 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/

相关文章:

java - 通过 BlazeDS 从 Java 到 Flex 的自定义编码

java - URL 不存在时出现 SAXParseException

java - 如何使用错误响应休息模板处理 200 状态代码?

java - Spring - 使用@Configurable 和@Value 注释用新运算符创建对象

java - Spring ehcache no such method错误

javascript - JQuery 验证失败后页面仍然回发

java - 使用 Java 的 Apache Spark 对象序列化

java - 如何在hibernate中解析联合查询的结果

javascript - 以 http ://www. test.com 形式验证 URL

java - 通过 postValidate 进行 JSF 跨字段验证,无需在支持 bean 中按名称查找组件