从另一个类的静态方法初始化Spring bean?

时间:2012-03-27 07:36:44

标签: java spring bean-validation applicationcontext

我试图创建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"/>

2 个答案:

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

查看文档的详细信息:

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

回答你的问题 - 如何在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" />