1

Spring MVC では、サーバー側の検証に @Min、@Max、@NotNull などの注釈を使用します。これらの注釈は、モデル クラスに配置する必要があります。必要に応じてそのような注釈を適用したいとします。モデル クラスにそのような注釈を適用したくありません。

例えば。

プロパティName、Gender、Emailを持つクラスPersonがあります。電子メール プロパティに @NotNull 注釈を付けると、グローバルに適用されます。システムに学生と教師の 2 人がいて、教師の登録メールはオプションですが、学生の場合は null ではない場合のように要件が変更された場合、どうすればよいでしょうかこれを達成します。

上記の例の場合、検証注釈を動的に適用できますか?

UserRegistration が For Teacher の場合、E メールはオプションです。

UserRegistration が学生用の場合、E メールは必須です。

4

3 に答える 3

6

この動作を実現するには、動的にアクティブ化するグループを使用することをお勧めします。以下の私の例を見てください。

Person.java:

class Person {

    @NotNull(groups = StudentChecks.class)
    @Email
    private email;

    // other members with getters/setters

    public interface StudentChecks {
    }
}

この場合、制約はグループがアクティブ化@NotNullされている場合にのみ実行されます。StudentChecks条件によって検証グループをアクティブ化するために、Spring は特別な注釈を提供します@Validated

StudentController.java:

@Controller
public class StudentController {

    @RequestMapping(value = "/students", method = RequestMethod.POST)
    public String createStudent(@Validated({Person.StudentChecks.class}) Person student, BindingResult result) {
        // your code
    }

}

あなたがそこに見つけることができる詳細:

于 2013-01-08T10:13:22.930 に答える
1

独自のバリデーターを実装し、コントローラーに登録する必要があります。

于 2013-01-08T09:48:57.453 に答える
0

これは、BeanValidationを使用することによって提示される問題の1つです。それらが実際にグローバルに適用されているという事実。

一般的な問題は、@ before ore @afterアノテーションが付いた日付でエンティティを更新すると、無効な更新が発生することです。実際、これらをチェックする必要はありません。

この問題を修正する一般的な方法は、コントローラーでモデルオブジェクトを直接受け入れる代わりに、DTOまたはデータ転送オブジェクトを使用することです。そのアクション専用のクラスを作成します(他のアクションで再利用できます。この方法で、ソフトウェアが実際に行うことからモデル化し、Springはスローするすべてのものをバインドするだけなので、より安全です。たとえば、ユーザーオブジェクトに管理者フラグがある場合、この管理者フラグが投稿されてtrueに設定されていると、Springは喜んでいっぱいになります。 DTOを使用すると、必要なフィールドをコピーして、残りを無視できます。

于 2013-01-08T09:58:22.753 に答える