【问题标题】:Hibernate-validator Groups with Spring MVC使用 Spring MVC 的 Hibernate-validator 组
【发布时间】:2014-07-10 15:31:59
【问题描述】:

我正在使用 hibernate-validator 4.3.1 和 Spring MVC 3.2.3。

我的应用程序有一个具有以下属性和注释的 bean(为了简单起见,我删除了大部分):

public class Account {
  @NotEmpty(groups = GroupOne.class)
  private String name;

  @NotEmpty(groups = GroupOne.class)
  private Date creationDate;

  @NotEmpty(groups = GroupTwo.class)
  private String role;

  @NotEmpty(groups = GroupTwo.class)
  private String profile;

  //getters and setters
}

如图所示,有两组验证,因为应用程序有一个由两步组成的向导表单:第一步,用户填写名称和创建日期字段,第二步填写角色和个人资料字段。

我添加了一些控制器方法作为例子:

@RequestMapping(value = "/account/stepOne", method = "POST")
public String stepOne(@ModelAttribute @Validated(GroupOne.class) Account account, BindingResult bindingResult) {
  //Implementation
}

@RequestMapping(value = "/account/stepTwo", method = "POST")
public String stepTwo(@ModelAttribute @Validated(GroupTwo.class) Account account, BindingResult bindingResult) {
  //Implementation
}

上述方法指定了@Validated 注解必须应用的验证。

到目前为止,一切正常,但是当我想以另一种形式重用该 bean 时,我遇到了一些问题。这个表单显示了bean的所有字段,控制器接收提交的方法如下:

@RequestMapping(value = "/account/stepOne", method = "POST")
public String stepOne(@ModelAttribute @Validated Account account, BindingResult bindingResult) {
  //Implementation
}

如您所见,组的名称已从 @Validated 注释中删除,因为我想应用 Account bean 中定义的所有验证。

但是,它不起作用,唯一让它起作用的方法就是将 Default 组添加到 bean 的属性中,如下所示:

public class Account {
  @NotEmpty(groups = {GroupOne.class, Default.class})
  private String name;

  @NotEmpty(groups = {GroupOne.class, Default.class})
  private Date creationDate;

  @NotEmpty(groups = {GroupTwo.class, Default.class})
  private String role;

  @NotEmpty(groups = {GroupTwo.class, Default.class})
  private String profile;

  //getters and setters
}

有没有更优雅的方法来实现这一点?

【问题讨论】:

    标签: java hibernate-validator


    【解决方案1】:

    没有比这更优雅的方式了。在不指定组的情况下进行验证将验证默认组。因此,您必须按照说明添加它。唯一的另一种选择是通过@Validated({GroupOne.class, GroupTwo.class}) 明确验证您感兴趣的所有组。我想这取决于你喜欢什么。

    【讨论】:

    • 我意识到我可以在@Validated 中定义验证组,但我也不喜欢它。不管怎样,谢谢你的回答。
    • 必须意识到,无论您将默认值命名为哪个组(意思是,没有组的属性,不要将其与问题代码中使用的Default.class 混淆)总是得到验证。因为这可能不是人们在明确命名组时所期望的,所以我只想指出。
    • 这里是关于分组约束的文档以获取更多信息docs.jboss.org/hibernate/validator/5.4/reference/en-US/…
    • @Alex Biddle 好的,让我们暂时将 Telle 问题中的示例放在一边。假设我们有三个属性 abc。现在,将 a 分配给“GroupA.class”,将 b 分配给“GroupB.class”。 c 根本没有组。如果您注释 '@Validated({GroupA.class})' 那么 a c 将被验证,而不仅仅是 a (至少它是我写评论时使用的版本)。我花了几个小时才意识到这是默认行为,而不是我的编码错误。
    • @MyBrainHurts 我明白了,感谢您抽出宝贵时间回复
    【解决方案2】:

    如果您使用 Default 扩展您的组接口,它应该会自行处理。

    喜欢

    public interface Group1 extends Default {}
    

    【讨论】:

      【解决方案3】:

      你可以使用@Valid

      public ModelAndView myMethod(@ModelAttribute @Valid MyDto myDto, BindingResult result){
      
        if(result.hasErrors()){
          ....
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-12
        • 1970-01-01
        • 2017-11-07
        • 2018-10-25
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        相关资源
        最近更新 更多