1

JSR-303 アノテーションを使用して、コンテキストの起動時にSpring Bean を検証する簡単な方法はありますか? JSR-303 アノテーション付き POJO として構成を表すいくつかのクラスを継承しました。これらはオブジェクト階層全体に渡されるため、私はそれらを使用するのにちょっと行き詰まっています。

このようなクラスのプロパティを設定する Bean を定義し、コンテキストの起動時に JSR-303 バリデーターを実行して、すべての値が正しく設定されるようにすることを想像できます。

Spring MVC でバインドされたフォーム送信の検証について尋ねているわけではないことに注意してください。

4

2 に答える 2

2

コンテキストの初期化の直後にこの検証を行いたい場合は、次のようにすることができます。

@Component
public class MyValidator ApplicationListener<ContextRefreshedEvent> {

    @Autowired private ListableBeanFactory bf;
    @Autowired private Validator validator;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        for (String name : bf.getBeanDefinitionNames()) {
            Object bean = bf.getBean(name);
            validator.validate(bean);
        }
    }
}

しかし、私はそれをテストしていません。

于 2012-07-19T08:28:01.877 に答える
1

短い答えはノーです。JSR-303 で最初に言及されたわけではありませんが、通常は MVC のデータ バインディングと検証に使用されます。私は次のことを試してみます。

JSR-303 アノテーションがあるため、Spring コンテキストで JSR-303 バリデーターを構成します。この場合、LocalValidatorFactoryBean標準の JSR-303 検証メカニズムをブートストラップするのは になります。クラスパスで利用可能な JSR-303 のベンダー/インプリメンターが必要であることに注意してください (例: Hibernate Validator)。

ApplicationContextListener<ContextStartedEvent>アプリケーション コンテキストが開始されて準備ができたときにイベントを受け取るようにのインスタンスを実装します。また、Bean が次のインスタンスを受け取ることを許可しますLocalValidatorFactoryBean

public class GenericApplicationValidator implements ApplicationListener<ContextStartedEvent> {

  private ValidatorFactoryBean validatorFactoryBean;

  public void onApplicationEvent(ContextStartedEvent e) {
    // Refer to next step
  }

  public void setValidatorFactoryBean(ValidatorFactoryBean vfb) {
    this.validatorFactoryBean = vfb;
  }
}

メソッド内onApplicationEvent(ContextStartedEvent e):

  1. アプリケーション コンテキストのインスタンスを取得します。
  2. アプリケーション コンテキストを通じて、検証する必要があるすべての Bean を見つけます。
  3. アクセスできますvalidatorFactoryBean.getValidator()
  4. すべての Bean を反復処理し、バリデーターを使用して Bean を検証します。

私はこれを行う経験がなかったことを覚えておいてください。しかし、それはあなたが必要とするものを達成するために近づくための1つの方法になり得るように私には思えます.

于 2012-07-19T08:35:11.797 に答える