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"/>
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" />
ドキュメントの詳細を参照してください。
あなたの質問に答えるために-このような状況でSpringでBeanを作成するにはどうすればいいですか?LocalValidatorFactoryBean
などのユーティリティクラスを使用します。これにより、Springの構成が簡素化されます。
これを試しましたか?
<bean id="validatorFactory"
class="javax.validation.Validation"
factory-method="buildDefaultValidatorFactory" />
<bean id="validator"
class="javax.validation.Validator"
factory-bean="validatorFactory"
factory-method="getValidator" />