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

我试图创建Hibernate Validator bean,并遇到这个问题,在另一个类中创建一个从静态工厂方法的bean。我找到了一种弹簧方法来初始化我的验证器bean(底部的解决方案),但问题本身仍未解决。验证器在这里用作示例案例。

这就是我在Java中创建验证器实例的方式

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

这就是我尝试在 applicationContext 中创建 Bean 的方式.xml

<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 的实例,并将其作为验证器Factory的“factory-bean”,如下所示:

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

答案 1

应仅包含方法名称,而不包括类名。factory-method

如果要使用静态工厂,请将 factory(!) 的 1 提供给 bean 声明,如果要使用实例工厂,请提供 to bean 声明,但不要同时给出两者:创建的 Bean 的类不在 bean 声明中给出。classfactory-bean

因此,一个完整的示例应如下所示,使用静态工厂和实例工厂:validatorFactoryvalidator

<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? - 完全按照这里显示的方式进行,或者如果可以的话,使用像这样的实用程序类,它简化了Spring配置。LocalValidatorFactoryBean


答案 2

你试过这个吗?

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

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

推荐