我试图创建 Hibernate Validator bean,并在另一个类中从静态工厂方法创建 bean 时遇到了这个问题。我找到了一种 Spring 方法来初始化我的 Validator bean(底部的解决方案),但问题本身仍未解决。这里使用 validator 作为示例。
这就是我在 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" />
我的理解是,在“工厂方法”中,您只能访问在“类”参数中定义的类中定义的静态方法。由于 buildDefaultValidatorFactory() 方法是静态的,因此我无法创建 Validation 实例并将其作为 validatorFactory 的“工厂 bean”,如下所示:
<bean id="validation" class="javax.validation.Validation" />
<bean id="validatorFactory"
class="javax.validation.ValidatorFactory"
factory-bean="validation"
factory-method="buildDefaultValidatorFactory" />
这会导致错误消息
"Check that a method with the specified name exists and that it is non-static"
问题是在 Spring 的这种情况下如何创建 bean?
这就是我解决 validator 问题的方法:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
最佳答案
factory-method
应该只包含方法名,不包括类名。
如果您想使用静态工厂,请将工厂的 class
(!)给 bean 声明,如果您想使用实例工厂,请将 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 配置。
关于java - 从另一个类的静态方法初始化 Spring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885203/