javascript
Spring MVC中的验证组
可以通過groups屬性將Bean驗證中的驗證約束添加到一個或多個組。 這使您可以限制在驗證期間應(yīng)用的約束集。 在某些小組應(yīng)先于其他小組進行驗證(例如在向?qū)е?#xff09;的情況下,這可能很方便。 從Spring MVC 3.1開始,可以通過org.springframework.validation.annotation.Validated注釋使用驗證組進行自動驗證。 在本文中,我將使用簡單的Spring MVC應(yīng)用程序來演示如何輕松使用驗證組來驗證Spring的MVC模型屬性。
形成
讓我們從將逐步驗證的表單類開始。 首先,我們定義代表約束組的接口:
public class Account implements PasswordAware {interface ValidationStepOne {// validation group marker interface}interface ValidationStepTwo {// validation group marker interface} }驗證約束
接下來,我們將約束分配給組。 請記住,如果您不提供組,則將使用默認組。 另請注意@SamePasswords和@StrongPassword –自定義約束,必須定義groups屬性:
@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 }巫師
有了Account ,我們可以創(chuàng)建一個三步向?qū)?#64;Controller ,該向?qū)⒃试S用戶創(chuàng)建一個帳戶。 第一步,我們將讓Spring驗證ValidationStepOne組中的約束:
@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";} }為了觸發(fā)組的驗證,我使用了@Validated注解。 該批注采用帶有組類型的var-arg參數(shù)。 代碼@Validated(ValidationStepOne.class)觸發(fā)ValidationStepOne組中約束的ValidationStepOne 。
在下一步中,我們將讓Spring在ValidationStepTwo組中驗證約束:
@Controller @RequestMapping("validationgroups") @SessionAttributes("account") public class AccountController {@RequestMapping(value = "stepTwo")public String stepTwo() {return VIEW_STEP_TWO;}@RequestMapping(value = "stepTwo", method = RequestMethod.POST)public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account, Errors errors) {if (errors.hasErrors()) {return VIEW_STEP_TWO;}return "redirect:summary";} }在摘要步驟中,我們將確認輸入的數(shù)據(jù),并讓Spring驗證兩組的約束:
@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 3.1之前,您可以手動觸發(fā)驗證。 我在以前的一篇文章中對此進行了描述: http : //blog.codeleak.pl/2011/03/how-to-jsr303-validation-groups-in.html
注意:如果要在不使用Spring的情況下使用驗證組,則需要將組傳遞給javax.validation.Validator#validate() :
沒有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);這也是測試驗證的最簡單方法:
public class AccountValidationTest {private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();@Testpublic void shouldHaveFourConstraintViolationsWhileValidatingBothGroups() {Account account = new Account();Set<ConstraintViolation<Account>> constraintViolations = validator.validate(account, Account.ValidationStepOne.class, Account.ValidationStepTwo.class);assertThat(constraintViolations).hasSize(4);}@Testpublic void shouldHaveTwoConstraintViolationsWhileStepOne() {Account account = new Account();Set<ConstraintViolation<Account>> constraintViolations = validator.validate(account, Account.ValidationStepOne.class);assertThat(constraintViolations).hasSize(2);} }使用Spring Test進行測試驗證
如果驗證/綁定失敗,使用Spring Test進行測試驗證將提供更復(fù)雜的測試方法。 對于示例,請查看我的另一篇博客文章: Spring MVC集成測試:斷言給定的模型屬性具有全局錯誤
- 可以在這里找到本文的源代碼: https : //github.com/kolorobot/spring-mvc-beanvalidation11-demo
翻譯自: https://www.javacodegeeks.com/2014/08/validation-groups-in-spring-mvc.html
總結(jié)
以上是生活随笔為你收集整理的Spring MVC中的验证组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaFX技巧4:总结
- 下一篇: Linux路由表(linux 了路由表)