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

标签 java spring bean-validation applicationcontext

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

这就是我在 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 的“工厂 bean”,如下所示:

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

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

这会导致错误消息

"Check that a method with the specified name exists and that it is non-static"

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

这就是我解决 validator 问题的方法:

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

最佳答案

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? - 完全按照此处所示的方式进行操作,或者如果可以,请使用 LocalValidatorFactoryBean 之类的实用程序类,这简化了 Spring 配置。

关于java - 从另一个类的静态方法初始化 Spring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885203/

相关文章:

java - Java 类之间的共享数组列表

java - 使用 JDBC 和预准备语句时 SQL 语法出现问题

java - 在 spring 中加载属性文件时出现问题

java - Spring bean 验证不会替换类型不匹配错误的消息

java - 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

java - OpenCsv 用 BeanToCsv + HeaderColumnNameTranslateMappingStrategy 写错列名

java - 哪个版本的 Java 可与 Liquibase Maven 插件配合使用?

java - block 大小为 n 的 Spring Batch 作业仅写入第 n 行 n 次

java - Java Web 应用程序的内存消耗(300MB 太高?)

java - Spring 中 @Valid 与 @Validated 的用法