web-dev-qa-db-ja.com

Springアノテーション@ModelAttributeおよび@Valid

@ModelAttribute@Validを使用する利点は何ですか?

違いはどれですか?

それらを一緒に使用することは可能ですか?

9
vdenotaris

@ModelAttributeは、メソッドパラメータまたはメソッドの戻り値の型を名前付きモデル属性にマップ/バインドするために使用されます。 @ ModelAttribute sJavaDocを参照してください。これはSpringアノテーションです。

@Validは、オブジェクトを JSR-303 Bean Validation としてマークするアノテーションです。 @ Valid sJavaDocを参照してください。これはJavaEE6の一部ですが、Hibernateには、ほとんどの人が代わりに使用する以前の実装があると思います。

@ModelAttributeを使用する利点は、フォームの入力をBeanにマップできることです。 @Validの利点は、JSR-303 Bean検証を利用して、作成されたBeanがいくつかのルールセットに対して検証されていることを確認できることです。

はい、@ModelAttribute@Validを一緒に使用できます。

フォーム(sic View)からModelオブジェクトにデータを転送する最良の方法は、Springを使用して典型的/従来のMVCデザインパターンに従うことです。私の個人的な好みの方法は、JSPにSpring JSTL <form:*>タグを付け、modelAttributeを設定したフォームを作成することです。コントローラで、フォームの入力を表すBeanである一致する@ModelAttributeを持つフォームからPOSTを受け入れるハンドラを持っています。次に、その「フォームBean」を渡します。 「必要に応じて「FormBean」を任意のモデルに変換する(フォームがモデルオブジェクトを直接作成する場合は不要)、DAOを介した保存/更新などを行うために、サービスレイヤーに移動します。これは1つの方法にすぎません。物事を行うためですが、それはおそらく私が日常の仕事で春に行うことの大部分です。

私は強く春の参考資料を読み、チュートリアルに従うことをお勧めします。参考資料は非常によく書かれていて、わかりやすく、Springで物事を行うさまざまな方法の例がたくさん含まれています。通常、Springで物事を行う方法にはかなりの数のオプションがあります。

16
CodeChimp

以下の部分を確認してください 春のリファレンスドキュメント

データバインディングに加えて、データバインディングエラーの記録に使用されたものと同じBindingResultを渡す独自のカスタムバリデーターを使用して検証を呼び出すこともできます。これにより、データバインディングと検証のエラーを1つの場所に蓄積し、その後ユーザーに報告することができます。

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) {
    new PetValidator().validate(pet, result);
    if (result.hasErrors()) {
    return "petForm";
    }

    // ...
}

または、JSR-303 @Validアノテーションを追加して、検証を自動的に呼び出すことができます。

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result)             {
    if (result.hasErrors()) {
        return "petForm";
    }

    // ...

}
9