Spring MVC 3.1开始引入了分组验证。
接下来一步步演示如何进行分组验证,分为用spring和不用spring两部分。
创建分组
就是建几个接口
public class Account implements PasswordAware {
interface ValidationStepOne {
// validation group marker interface
}
interface ValidationStepTwo {
// validation group marker interface
}
}
定义验证限制
@SamePasswords(groups = {Account.ValidationStepTwo.class})
public class Account implements PasswordAware {
@NotBlank(groups = {ValidationStepOne.class})
private String username;
@Email(groups = {ValidationStepOne.class})
@NotBlank(groups = {ValidationStepOne.class})
private String email;
@NotBlank(groups = {ValidationStepTwo.class})
@StrongPassword(groups = {ValidationStepTwo.class})
private String password;
@NotBlank(groups = {ValidationStepTwo.class})
private String confirmedPassword;
// getters and setters
}
在controller中使用@Validated进行验证
@Controller
@RequestMapping("validationgroups")
@SessionAttributes("account")
public class AccountController {
@RequestMapping(value = "stepOne")
public String stepOne(Model model) {
model.addAttribute("account", new Account());
return VIEW_STEP_ONE;
}
@RequestMapping(value = "stepOne", method = RequestMethod.POST)
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account, Errors errors) {
if (errors.hasErrors()) {
return VIEW_STEP_ONE;
}
return "redirect:stepTwo";
}
}
@Controller
@RequestMapping("validationgroups")
@SessionAttributes("account")
public class AccountController {
@RequestMapping(value = "summary")
public String summary() {
return VIEW_SUMMARY;
}
@RequestMapping(value = "confirm")
public String confirm(@Validated({Account.ValidationStepOne.class, Account.ValidationStepTwo.class}) Account account, Errors errors, SessionStatus status) {
status.setComplete();
if (errors.hasErrors()) {
// did not pass full validation
}
return "redirect:start";
}
}
以上就是用spring框架进行验证的步骤。如果不用spring,步骤如下:
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Account account = new Account();
// validate with first group
Set<ConstraintViolation<Account>> constraintViolations =
validator.validate(account, Account.ValidationStepOne.class);
assertThat(constraintViolations).hasSize(2);
// validate with both groups
Set<ConstraintViolation<Account>> constraintViolations =
validator.validate(account, Account.ValidationStepOne.class, Account.ValidationStepTwo.class);
assertThat(constraintViolations).hasSize(4);
一个小小的坑
定义验证限制的地方如果group不写就是Default.class,也是一个接口。所以如果只在一个字段上指定了自定义的group(Gp.class),并且在验证参数的时候(无论用spring注解还是不用spring)只指定了Gp,没有Default,那除了Gp标注的字段,其它的都不会被验证。
可以用Gp继承Default,或者就每个都写清楚。