我正在使用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
}
有没有更优雅的方法来实现这一目标?
答案 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 {}