Подтвердить что ты не робот

Инициализация Spring bean из статического метода из другого класса?

Я пытался создать Hibernate Validator bean и столкнулся с этой проблемой, создав bean из статического метода factory в другом классе. Я нашел способ Spring для инициализации моего Validator bean (решение внизу), но сама проблема остается нерешенной. Валидатор используется в качестве примера здесь.

Вот как я создаю экземпляр Validator в Java

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

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

Вот как я попытался создать bean в applicationContext.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" />

Я понимаю, что в "factory -методе" вы можете получить доступ только к статическим методам, определенным в классе, определенном в параметре "class". Поскольку метод buildDefaultValidatorFactory() является статическим, я не могу создать экземпляр Validation и передать его как "factory - bean" для validatorFactory следующим образом:

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

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

Это заканчивается сообщением об ошибке

"Убедитесь, что существует метод с указанным именем и нестатический

Вопрос: как бы вы создали bean в такой ситуации в Spring?

Вот как я решил проблему Validator:

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

Ответ 1

factory-method должен содержать только имя метода, не включая имя класса.

Если вы хотите использовать статический factory, введите class из factory (!) в объявление bean, если вы хотите использовать экземпляр factory, введите factory-bean к объявлению bean, но не дают обоих: класс созданного bean не указан в объявлении bean.

Таким образом, полный пример должен выглядеть так, используя статический factory для validatorFactory и экземпляр factory для 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 в такой ситуации в Spring? - Сделайте это точно так, как показано здесь, или если вы можете, используйте класс утилиты, такой как LocalValidatorFactoryBean, который упрощает конфигурацию Spring.

Ответ 2

Вы пробовали это?

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

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