2017-02-23 5 views
2

Ich habe Probleme mit Thymeleaf beim Validieren Formular. Ich versuche, einfaches Benutzerregistrierungsformular zu schaffen, um Frühling zu erlernen, und ich bin leider fest.Spring Boot + Thymelaf - Formular Validierung

Hier ist meine Klasse Userform

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

     ...Getters and setters... 
    } 

Das erste Problem ist, wenn ich in meiner initBinder benutzerdefinierten Validator-Klasse hinzufügen

@Autowired 
    private UserFormValidator formValidator; 

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

"Default" kommentiert von @NotEmpty Validierung nicht mehr funktioniert. Das ist ein ausgeartetes Verhalten?

Das zweite Problem ist, wie kann ich globale ablehnen Nachrichten in thymeleaf zeigen? Meine Validator-Klasse ist wie unten

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

und Post-Mapping von der Steuerung

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

als "default" Validierungsfehler i unter Verwendung von ex th zeigen kann: if = "$ {# fields.hasErrors ('passwordConfirm')} " ich habe keine Ahnung, wie kann ich Nachricht für Fehler passwords.no.match zeigen oder überprüfen, ob dieser Fehler aufgetreten ist?

Antwort

4

Standardmäßig verwendet der Spring-Boot die Bean-Validierung, um das mit @Valid annotierte Formularobjekt zu validieren. Wenn Sie Ihren benutzerdefinierten Validator verwenden und ihn über @InitBinder registrieren möchten, findet keine Bean-Validierung statt. Dies ist das erwartete Verhalten. Wenn Sie die Bean-Validierung auch mit Ihrer benutzerdefinierten Validierung durchführen möchten, müssen Sie dies manuell in Ihrer Validator-Klasse oder sogar im Controller tun.

Hier kommt Ihr zweites Problem zu zeigen Passwort nicht übereinstimmen Fehlermeldung. In Ihrem benutzerdefinierten Validator UserFormValidator.class während die Ablehnung eines beliebigen Wertes müssen rejectValue verwenden() -Methode wie folgt:

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

Die rejectValue() -Methode einen Validierungsfehler hinzufügen verwendet wird, um die Fehler zu widersprechen. Der erste Parameter gibt an, welchem ​​Feld der Fehler zugeordnet ist. Der zweite Parameter ist ein Fehlercode, der als Nachrichtenschlüssel für die Datei messages.properties (oder messages_en.properties oder messages_fr.properties usw. fungiert, falls diese verwendet werden). Der dritte Parameter von rejectValue() stellt die Fallback-Standardnachricht dar, die angezeigt wird, wenn im Ressourcenpaket kein passender Fehlercode gefunden wird.

Jetzt können Sie Fehlermeldungen mit th:if="${#fields.hasErrors('passwordConfirm')} in Ihrem Formular anzeigen.

+0

Vielen Dank :) –