2017-03-14 16 views
0

私は、リセットパスワードフォームのPOST要求を処理するコントローラメソッドを持っています。このフォームには、リセットトークンの入力フィールドが隠されており、ユーザーに新しいパスワードを入力するよう求められます。Hibernate @Validator with Spring Boot

下記のコードで@Valid注釈を使用したいと思いますが、既存のUserクラスを使用できるかどうかはわかりません。

Hibernate Validatorは、フォーム用に特別なクラスを追加する必要がありますか?

コントローラ方法

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

Userクラス

@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

あなたは何を検証しますか?リクエストからの 'token'と' password'ですか? –

+0

@bureaqueteはい –

+0

'@ RequestBody'を使用せず、コントローラメソッドで' User'クラスを直接使うのはなぜですか?それで、フォームは本質的に 'User'クラスなのですから、' @ Valid'アノテーションを追加することはできますか? 'token'と' reset_token'フィールド名は異なっていますが。 –

答えて

2

あなたが適用できるようにするには、あなたのリクエストボディとして直接そのクラスを使用する方も、別のクラスを作成するべきですその上に@Valid;

コントローラメソッド

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

新しい要求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 
} 

あなたが要求してきたように、これは、検証を自動化します。ここではUserクラスを使用できない理由は、現在のフォームには存在しない@NotEmptyなどの制限があるフィールドが他にも存在するため、検証に失敗することがあります。

エクストラコメント:私はデータベースとコントローラ層の検証&操作のために同じオブジェクトを使用すると、両者の間に高い結合を作成し、私はロジック・クラスの下にテーブルに関連するクラスを維持するお勧め、およびエンドポイント固有のもののインターフェイス豆を使用したいと思いますコントローラーレイヤー内。

関連する問題