42

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

我的理解是,在“工厂方法”中,您只能访问“类”参数中定义的类中定义的静态方法。由于 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" />

这最终导致错误消息

“检查具有指定名称的方法是否存在并且它是非静态的

问题是您将如何在 Spring 的这种情况下创建 bean?

这就是我解决验证器问题的方法:

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

2 回答 2

52

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

如果要使用静态工厂,class请将工厂(!)factory-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?- 完全按照此处所示进行操作,或者如果可以的话,使用类似 的实用程序类LocalValidatorFactoryBean,它可以简化 Spring 配置。

于 2012-03-27T07:48:57.640 回答
0

你试过这个吗?

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

<bean id="validator" 
class="javax.validation.Validator" 
factory-bean="validatorFactory"
factory-method="getValidator" />
于 2012-03-27T07:56:12.570 回答