1

JSR-303 Bean 検証を使用して、バックエンド サービスと通信できるカスタム アノテーションを作成することは可能ですか?

このタイプの検証は、「古い学校の」Spring バリデーターで実現しました。その場合、バリデーターは Spring Bean であり、他のサービスを注入することができました。次に、そのバリデーターがコントローラーに挿入されます。

例としては、電子メールが既に存在するかどうかを確認するための注釈 (おそらく @EmailExists) があります。これは、当社のサービスの 1 つを使用した SQL クエリでのみ実行できます。これを他の注釈と一緒に「検証」し、できるだけ早くチェックし、バックエンド サービスで明示的に行う必要はありません。

注: iBatis/MyBatis を使用しているため、JPA/Hibernate のトリックは使用できません :-)

ありがとう!

4

1 に答える 1

1

それは間違いなく可能です。Springは、制約バリデーター内でも依存性注入のサポートを提供します。したがって、次のように、カスタムバリデーターに必要なサービスを簡単に挿入できます。

public class EmailExistsValidator implements ConstraintValidator<EmailExists, String> {

    @Inject
    private EmailValidationService service;

    @Override
    public void initialize(EmailExists constraintAnnotation) {}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        if (value == null) {
            return true;
        }

        return service.exists(value);
    }
}

具体的なシナリオによっては、最初になどの「安価な」制約をチェックし@NotNull、これらの制約が有効な場合にのみ、などのより高価な制約をチェックすることをお勧めし@EmailExistsます。

これは、グループシーケンスと、タイプに合わせて再定義されたデフォルトのグループシーケンスを使用して行うことができます。

于 2011-08-18T17:50:22.347 に答える