Spring MVC では、検証を実行する方法が 3 つあります。アノテーションを使用する方法、手動で行う方法、または両方を組み合わせた方法です。検証するための独自の「最もクリーンで最良の方法」はありませんが、プロジェクト/問題/コンテキストにより適した方法がおそらくあるでしょう。
User を持ってみましょう:
public class User {
private String name;
...
}
方法 1 : Spring 3.x+ と簡単な検証が必要な場合は、javax.validation.constraints
アノテーション (JSR-303 アノテーションとも呼ばれます) を使用します。
public class User {
@NotNull
private String name;
...
}
リファレンス実装であるHibernate Validatorのような JSR-303 プロバイダがライブラリに必要です(このライブラリはデータベースやリレーショナル マッピングとは関係なく、検証を行うだけです :-)。
次に、コントローラーには次のようなものがあります。
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
@Valid に注意してください。ユーザーの名前が null の場合、result.hasErrors() は true になります。
方法 2 :複雑な検証 (大企業の検証ロジック、複数のフィールドにわたる条件付き検証など) がある場合、または何らかの理由で方法 1 を使用できない場合は、手動検証を使用します。コントローラーのコードを検証ロジックから分離することをお勧めします。検証クラスを最初から作成しないでください。Spring は便利なorg.springframework.validation.Validator
インターフェースを提供します (Spring 2 以降)。
だから、あなたが持っているとしましょう
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
また、次のような「複雑な」検証を行いたい場合: ユーザーの年齢が 18 歳未満の場合、responsibleUser を null にすることはできず、responsibleUser の年齢を 21 歳以上にする必要があります。
あなたはこのようなことをします
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
次に、コントローラーで次のようになります。
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
検証エラーがある場合、result.hasErrors() は true になります。
注:「binder.setValidator(...)」を使用して、コントローラーの@InitBinderメソッドでバリデーターを設定することもできます(この場合、デフォルトを置き換えるため、メソッド1と2を混在させることはできませんバリデータ)。または、コントローラーのデフォルトのコンストラクターでインスタンス化することもできます。または、コントローラーに注入する @Component/@Service UserValidator (@Autowired) を用意します。ほとんどのバリデーターはシングルトンであり、単体テストのモックが容易になり、バリデーターは他の Spring コンポーネントを呼び出すことができるため、非常に便利です。
方法 3 :
両方の方法を組み合わせて使用しないのはなぜですか? 「名前」属性などの単純なものを注釈で検証します (実行が速く、簡潔で読みやすいです)。バリデーターの重い検証を維持します (カスタムの複雑な検証アノテーションをコーディングするのに何時間もかかる場合、またはアノテーションを使用できない場合)。私は以前のプロジェクトでこれを行いました。それは魅力的で、素早く簡単に機能しました。
警告:検証処理を例外処理と間違えてはいけません。この投稿を読んで、いつそれらを使用するかを確認してください。
参考文献: