我试图创建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" />
我了解的是,在“工厂方法”中,您只能访问在“ 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" />
这最终导致错误消息
“检查具有指定名称的方法是否存在,并且它 是非静态的 ”
问题是在春季这种情况下您将如何创建bean?
这是我解决验证程序问题的方法:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
本factory-method应该只包含方法的名称,不包括类名。
factory-method
如果要使用静态工厂,class则将factory(!)的值提供给bean声明,如果要使用实例工厂,将的值提供factory- bean给bean声明,但不要同时提供两者: bean声明中未提供bean。
class
factory- bean
因此,一个完整的示例应该看起来像这样,对它使用静态工厂,对它使用validatorFactory实例工厂validator:
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
要回答您的问题- 在春季的这种情况下,您将如何创建bean? -完全按照此处显示的方法进行操作,或者,如果可以的话,使用实用程序类(如LocalValidatorFactoryBean)来简化Spring配置。
LocalValidatorFactoryBean