2017-03-14 6 views
0

Ich habe eine Controller-Methode, die die POST-Anfrage für ein Reset-Passwort-Formular behandelt. Das Formular enthält ein verborgenes Eingabefeld für das Zurücksetztoken und fordert den Benutzer zur Eingabe eines neuen Kennworts auf.Hibernate @Validator mit Spring Boot

Ich möchte die @Valid Annotation in meinem Code unten verwenden, aber nicht sicher, ob ich meine vorhandene User Klasse verwenden kann.

Muss der Hibernate-Validator eine zusätzliche Klasse speziell für das Formular erstellen? Verfahren

-Controller

@RequestMapping(value = "/resetPassword", method = RequestMethod.POST) 
public ModelAndView setNewPassword(@RequestParam Map<String,String> requestParams) { 
    User user = userService.findUserByResetToken(requestParams.get("token")); 

    ModelAndView modelAndView = new ModelAndView(); 
    modelAndView.addObject("message", "Form data is " + requestParams.get("token") + requestParams.get("password") + user.getEmail()); 
    modelAndView.setViewName("resetPassword"); 

    return modelAndView; 
} 

Benutzerklasse

@Entity 
@Table(name = "user") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private int id; 

    @Column(name = "email") 
    @Email(message = "Please provide a valid e-mail") 
    @NotEmpty(message = "Please provide an e-mail") 
    private String email; 

    @Column(name = "password") 
    @Size(min = 8, max = 72, message = "Your password must be between 8 and 72 characters long") 
    @NotEmpty(message = "Please provide a password") 
    @Transient 
    private String password; 

    @Column(name = "first_name") 
    @NotEmpty(message = "Please provide your first name") 
    private String firstName; 

    @Column(name = "last_name") 
    @NotEmpty(message = "Please provide your last name") 
    private String lastName; 

    @Column(name = "enabled") 
    private boolean enabled; 

    @Column(name = "confirmation_token") 
    private String confirmationToken; 

    @Column(name = "created_on") 
    private Date createdOn; 

    @Column(name = "last_login") 
    private Date lastLogin; 

    @Column(name = "reset_token") 
    private String resetToken; 

    // Getters and setters omitted 
} 
+0

Was möchten Sie bestätigen? 'Token' &' Passwort' von Anfrage? –

+0

@bureaquete ja –

+0

Warum nicht '@ RequestBody' verwenden und direkt' User' in Ihrer Controller-Methode verwenden? Dann können Sie '@ Valid' Annotation hinzufügen, da das Formular im Wesentlichen' User' Klasse richtig ist? Obwohl die Feldnamen 'token' und' reset_token' unterschiedlich sind. –

Antwort

2

Sie sollten eine eigene Klasse zu schaffen, auch besser diese Klasse zu verwenden, um direkt als Ihre Anfrage Körper in der Lage sein, bewerben @Valid darauf;

Controller-Methode

@RequestMapping(value = "/resetPassword", method = RequestMethod.POST) 
public ModelAndView setNewPassword(@RequestBody @Valid PasswordUpdateRq passwordUpdateRq) { 
    User user = userService.findUserByResetToken(passwordUpdateRq.getToken()); 

    ModelAndView modelAndView = new ModelAndView(); 
    modelAndView.addObject("message", "Form data is " + passwordUpdateRq.getToken() + passwordUpdateRq.getPassword() + user.getEmail()); 
    modelAndView.setViewName("resetPassword"); 

    return modelAndView; 
} 

Neue Anfrage Bean

public class PasswordUpdateRq { 
    @Size(min = 8, max = 72, message = "Your password must be between 8 and 72 characters long") 
    @NotEmpty(message = "Please provide a password") 
    private String password; 
    private String token; 

    // Getters and setters omitted 
} 

Dadurch wird die Validierung automatisch wie Sie angefordert haben. Der Grund User Klasse ist hier nicht verwendbar ist, dass es andere Felder mit @NotEmpty usw. Einschränkungen gibt, die nicht in Ihrem aktuellen Formular vorhanden sind, und diese würden immer die Validierung fehlschlagen.

Extra-Kommentar: Ich denke, das gleiche Objekt für Controller-Schicht Validierung & Operationen mit Datenbank erzeugt eine hohe Kopplung zwischen zwei, würde ich halten Tabelle, Klassen unter Logik Klassen empfehlen und Interface-Bohnen verwenden, den Endpunkt-spezifisch sind in der Controller-Ebene.

Verwandte Themen