2012-03-27 125 views
37

我试图创建Hibernate Validator bean,并遇到了这个问题,在另一个类中从静态工厂方法创建一个bean。我发现Spring方法让我的Validator bean初始化(解决方案在底部),但问题本身仍未解决。此处使用验证器作为示例。从另一个类的静态方法初始化Spring bean?

这是我如何使用Java创建的校验器实例

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()是静态的,我不能创建验证的一个实例,并把它作为“工厂豆”为validatorFactory这样的:

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

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

这结束了对错误信息

“检查具有指定名称的方法依然存在,它是非静态

问题是你怎么会在这种春季的情况下创建豆?

这是我如何解决了这个问题,验证:

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

回答

46

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" /> 

查看文档的详细信息:

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

要回答你的问题 - 你如何在这种春季的情况下创建bean? - 完全按照此处显示的内容进行操作,或者如果可以,请使用类似LocalValidatorFactoryBean这样的实用程序类,它可以简化Spring配置。

+0

类名是为了证明我想要做的事情。正如我所说的“我所了解的是,在”工厂方法“中,只能访问在”类“参数中定义的类中定义的静态方法。” – Spaideri 2012-03-27 07:56:24

+0

这是正确的 - 如果您给出'class'参数,那么工厂方法必须是该类的静态方法,如创建'validatorFactory'所示。 – 2012-03-27 13:10:42

0

你试过这个吗?

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

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

嗨!方法buildDefaultValidatorFactory是类javax.validation.Validation的静态方法 – Spaideri 2012-03-27 08:39:25