【问题标题】:Spring MVC: use different JSR-303 validators on the same bean?Spring MVC:在同一个 bean 上使用不同的 JSR-303 验证器?
【发布时间】: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 种不同类型的约束验证。 idversion 要么都是 null,要么都是非 null。

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


【解决方案1】:

您可以使用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){
   ...
}

【讨论】:

  • 谢谢。这正是我刚刚尝试做的;不过还没有测试过。
猜你喜欢
  • 2013-11-23
  • 2011-07-24
  • 1970-01-01
  • 2015-01-10
  • 2018-01-30
  • 1970-01-01
  • 2011-10-29
  • 2014-03-24
  • 2012-02-08
相关资源
最近更新 更多