Spring MVCでは、検証を実行する3つの異なる方法があります。注釈を使用するか、手動で使用するか、または両方を組み合わせて使用します。検証するための独自の「クリーンで最良の方法」はありませんが、プロジェクト/問題/コンテキストにより適合する方法がおそらくあります。
ユーザーを作ろう:
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歳未満の場合、responseUserはnullであってはならず、responseUserの年齢は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:
両方の方法を組み合わせて使用しないのはなぜですか?「name」属性のような単純なものを、注釈を付けて検証します(これは素早く、簡潔で読みやすくなります)。バリデーターの重い検証を保持します(カスタムの複雑な検証注釈のコーディングに数時間かかる場合、または注釈を使用できない場合のみ)。私は以前のプロジェクトでこれを行いました、それは魅力的で素早く簡単に機能しました。
警告:検証処理と例外処理を混同しないでください。それらをいつ使用するかを知るには、この投稿を読んでください。
参照: