我试图创建Hibernate Validator bean,并遇到这个问题,从另一个类中的静态工厂方法创建一个bean。我找到了一种Spring方法来初始化我的Validator bean(底部的解决方案),但问题本身仍未解决。验证器在此处用作示例案例。
这就是我在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”参数中定义的类中定义的静态方法。由于方法buildDefaultValidatorFactory()是静态的,我无法创建验证实例并将其作为validatorFactory的“factory-bean”提供,如下所示:
<bean id="validation" class="javax.validation.Validation" />
<bean id="validatorFactory"
class="javax.validation.ValidatorFactory"
factory-bean="validation"
factory-method="buildDefaultValidatorFactory" />
这最终会出现错误消息
“检查是否存在具有指定名称的方法,并且非静态”
问题是你如何在Spring的这种情况下创建bean?
这就是我解决Validator问题的方法:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
答案 0 :(得分:48)
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? - 完全按照此处所示进行操作,或者如果可以的话,使用类似{{的实用程序类1}},简化了Spring配置。
答案 1 :(得分:0)
你试过这个吗?
<bean id="validatorFactory"
class="javax.validation.Validation"
factory-method="buildDefaultValidatorFactory" />
<bean id="validator"
class="javax.validation.Validator"
factory-bean="validatorFactory"
factory-method="getValidator" />