使用Spring MVC的Hibernate-validator组

时间:2014-07-10 15:31:59

标签: java hibernate-validator

我正在使用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
}

如图所示,有两组验证,因为应用程序有一个向导形式,由两个步骤组成:第一步,name和creationDate字段由用户填充,第二步是角色和配置文件字段。

我添加一些Controller方法作为示例:

@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中定义的所有验证。

但是,它没有用,唯一的方法是将默认组添加到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
}

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

3 个答案:

答案 0 :(得分:3)

没有更优雅的方式。在未指定组的情况下进行验证将验证默认组。因此,您必须按照描述添加它。唯一的另一种选择是通过@Validated({GroupOne.class, GroupTwo.class})显式验证您感兴趣的所有群组。我想这是你喜欢的味道问题。

答案 1 :(得分:0)

您可以使用 @Valid

public ModelAndView myMethod(@ModelAttribute @Valid MyDto myDto, BindingResult result){

  if(result.hasErrors()){
    ....
}

答案 2 :(得分:0)

如果使用Default扩展Group Interface,它应该自行处理。

public interface Group1 extends Default {}