2017-02-23 133 views
2

我在驗證表單時遇到了Thymeleaf問題。我試圖創建簡單的用戶註冊表單來學習Spring,並且我不幸陷入困境。Spring Boot + Thymeleaf - 表單驗證

這裏是我的窗體類

public class UserForm { 
     @NotEmpty 
     private String username; 
     @NotEmpty 
     private String password; 
     @NotEmpty 
     private String passwordConfirm;   

     ...Getters and setters... 
    } 

第一個問題是,當我在initBinder

@Autowired 
    private UserFormValidator formValidator; 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.setValidator(formValidator); 
    } 

「默認」 的@NotEmpty驗證註釋添加我的自定義驗證器類停止工作。這是被查出的行爲?

第二個問題是我怎樣才能顯示全球拒絕信息thymeleaf? 我的驗證器類是像下面從控制器

@PostMapping("/create") 
    public String registerUser(@ModelAttribute("form") @Valid final UserForm form, BindingResult bindingResult) { 
     if(bindingResult.hasErrors()) { 
      return "newuser"; 
     } 
     userService.saveUser(form); 
     return "redirect:/"; 
    } 

public class UserFormValidator implements Validator { 
    @Autowired 
    UserService userService; 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return UserForm.class.isAssignableFrom(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 
     UserForm userForm = (UserForm) target; 
     if(!userForm.getPassword().equals(userForm.getPasswordConfirm())) { 
      errors.reject("passwords.no.match", "Passwords not match"); 
     } 

     if(userService.findOneByUsername(userForm.getUsername()).isPresent()) { 
      errors.reject("user.exist", "User already exists (default)"); 
     } 
    } 
} 

和後映射爲「默認」驗證錯誤,我可以通過使用前日表示:如果=「$ {#fields.hasErrors ('passwordConfirm')}「我不知道如何顯示錯誤信息passwords.no.match或檢查是否發生此錯誤?

回答

4

默認情況下,spring引導使用bean驗證來驗證用@Valid註釋的表單對象。如果你想使用自定義驗證器並通過@InitBinder註冊,那麼bean驗證不會發生,這是預期的行爲。如果你想bean驗證也可以與你的自定義驗證一起工作,你需要在你的驗證器類或控制器中手動執行。

第二個問題是顯示密碼不匹配錯誤信息。內部自定義驗證UserFormValidator.class而拒絕你需要使用rejectValue像下面()方法的值:

@Override 
    public void validate(Object target, Errors errors) { 
     UserForm userForm = (UserForm) target; 
     if(!userForm.getPassword().equals(userForm.getPasswordConfirm())) { 
      errors.rejectValue("passwordConfirm", "passwords.no.match", "Passwords not match"); 
     } 

     if(userService.findOneByUsername(userForm.getUsername()).isPresent()) { 
      errors.rejectValue("username", "user.exist", "User already exists (default)"); 
     } 
    } 

的rejectValue()方法用於向錯誤對象添加驗證錯誤。 第一個參數標識錯誤與哪個字段相關聯。第二個參數是一個錯誤代碼,它爲messages.properties文件(或messages_en.properties或messages_fr.properties等,如果正在使用這些文件)提供消息密鑰。 rejectValue()的第三個參數表示回退默認消息,如果在資源包中未找到匹配的錯誤代碼,則顯示該消息。

現在,您可以在表單內使用th:if="${#fields.hasErrors('passwordConfirm')}顯示錯誤消息。

+0

非常感謝:) –