一尘不染

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

java

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

阅读 281

收藏
2020-12-03

共1个答案

一尘不染

factory-method应该只包含方法的名称,不包括类名。

如果要使用静态工厂,class则将factory(!)的值提供给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配置。

2020-12-03