web-dev-qa-db-ja.com

別のクラスの静的メソッドからSpring Beanを初期化していますか?

Hibernate Validator Beanを作成しようとして、別のクラスの静的ファクトリメソッドからBeanを作成するこの問題に遭遇しました。 Validator Beanを初期化するSpringの方法を見つけました(下部の解決策)が、問題自体は未解決のままです。ここでは、バリデーターが例として使用されます。

これが、JavaでValidatorインスタンスを作成する方法です

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

これは、applicationContext.xmlでBeanを作成しようとした方法です

<bean id="validatorFactory" 
    class="javax.validation.ValidatorFactory" 
    factory-method="javax.validation.Validation.buildDefaultValidatorFactory" />

<bean id="validator" 
    class="javax.validation.Validator" 
    factory-bean="validatorFactory"
    factory-method="getValidator" />

私が理解しているのは、「factory-method」では、「class」パラメーターで定義されたClassで定義された静的メソッドにのみアクセスできるということです。メソッドbuildDefaultValidatorFactory()は静的であるため、Validationのインスタンスを作成して、それを次のようにvalidatorFactoryの「factory-bean」として与えることはできません。

<bean id="validation" class="javax.validation.Validation" />

<bean id="validatorFactory" 
    class="javax.validation.ValidatorFactory" 
    factory-bean="validation"
    factory-method="buildDefaultValidatorFactory" />

これはエラーメッセージになります

「指定された名前のメソッドが存在し、それがnon-static "であることを確認してください

質問は、春のこのような状況でどのようにBeanを作成しますか?

これは私が検証ツールの問題を解決した方法です:

<bean id="validator"
  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
41
Spaideri

factory-methodには、クラス名を含めず、メソッド名のみを含める必要があります。

静的ファクトリーを使用する場合は、bean宣言にfactory(!)のclassを指定します。インスタンスファクトリーを使用する場合は、factory-beanをBean宣言に追加しますが、両方を指定しないでください。作成されたBeanのクラスは、Bean宣言に指定されません。

したがって、validatorFactoryの静的ファクトリーとvalidatorのインスタンスファクトリーを使用した完全な例は次のようになります。

<bean id="validatorFactory" 
    class="javax.validation.Validation" 
    factory-method="buildDefaultValidatorFactory" />

<bean id="validator" 
    factory-bean="validatorFactory"
    factory-method="getValidator" />

ドキュメントの詳細を参照してください。

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class-static-factory-method

あなたの質問に答えるために-このような状況でSpringでBeanを作成するにはどうすればいいですか?LocalValidatorFactoryBeanなどのユーティリティクラスを使用します。これにより、Springの構成が簡素化されます。

49

これを試しましたか?

<bean id="validatorFactory" 
class="javax.validation.Validation" 
factory-method="buildDefaultValidatorFactory" />

<bean id="validator" 
class="javax.validation.Validator" 
factory-bean="validatorFactory"
factory-method="getValidator" />
0
chalimartines