Инициализация 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"/>
Ответы
Ответ 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" />