Инициализация Spring-компонента из статического метода из другого класса? - PullRequest
41 голосов
/ 27 марта 2012

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

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

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

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

Так я пытался создать компонент в 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" />

Насколько я понимаю, в «фабричном методе» вы можете получить доступ только к статическим методам, определенным в классе, определенном в параметре «класс».Так как метод buildDefaultValidatorFactory () является статическим, я не могу создать экземпляр Validation и передать его как «фабричный бин» для validatorFactory следующим образом:

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

Ответы [ 2 ]

48 голосов
/ 27 марта 2012

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

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

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

0 голосов
/ 27 марта 2012

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

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

<bean id="validator" 
class="javax.validation.Validator" 
factory-bean="validatorFactory"
factory-method="getValidator" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...