2017-02-23 11 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... 
    } 

まず問題は、私は@NotEmpty検証によって注釈を付けinitBinder

@Autowired 
    private UserFormValidator formValidator; 

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

"デフォルト" で私のカスタムバリデータクラスを追加するときに動作を停止している私のユーザーフォームクラスです。これは例外的な行動ですか?

第2の問題は、どのようにしてthymeleafでグローバル拒否メッセージを表示できますか? 私のバリデータクラスは

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)"); 
     } 
    } 
} 

以下のようなもので、コントローラから、私は元番目を使用して表示することができ、「デフォルト」の検証エラーとして

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

をマッピングを投稿:= "$ {#1 fields.hasErrors場合( 'passwordConfirm')} "エラーpasswords.no.matchのメッセージを表示するか、このエラーが発生していないかどうかを確認できませんか?

答えて

4

デフォルトでは、スプリングブートは、@Validでアノテーションされた検証済みフォームオブジェクトに対してBean検証を使用します。カスタムバリデータを使用して@InitBinderを通じて登録する場合、Beanの検証は行われませんが、これは予想される動作です。 Beanの検証をしたい場合は、カスタム検証でも動作します。これは、バリデータークラスの内部またはコントローラ内で手動で行う必要があります。

ここでは、パスワード一致エラーメッセージを表示するための2番目の問題が発生します。カスタムバリデータ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()メソッドは、オブジェクトのエラーに検証エラーを追加するために使用されます。 最初のパラメータは、エラーがどのフィールドに関連付けられているかを示します。 2番目のパラメータは、messages.propertiesファイル(またはmessages_en.propertiesやmessages_fr.propertiesなどが使用されている場合)のメッセージキーとして機能するエラーコードです。 rejectValue()の3番目のパラメータは、リソースバンドルに一致するエラーコードが見つからない場合に表示されるフォールバックのデフォルトメッセージを表します。

フォーム内にth:if="${#fields.hasErrors('passwordConfirm')}を使用してエラーメッセージを表示することができます。

+0

ありがとうございました。 –

関連する問題