2012-03-27 4 views
37

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

Это, как я создаю экземпляр 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" /> 

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

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

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

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

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

Вопрос в том, как вы бы создать компонент в такого рода ситуации, весной?

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

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

ответ

46

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

Если вы хотите использовать статическую фабрику, дайте class фабрики (!) Для декларации bean-компонента, если вы хотите использовать фабрику экземпляра, дайте 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

Чтобы ответить вы задаете вопрос - Как бы вы создали bean-компонент в подобной ситуации весной? - Сделайте это точно так, как показано здесь, или, если хотите, используйте класс утилиты, такой как LocalValidatorFactoryBean, что упрощает настройку Spring.

+0

Название класса, чтобы продемонстрировать, что я хотел сделать. Как я сказал, «я понимаю, что в« заводском методе »вы можете получить доступ только к статическим методам, определенным в классе, определенном в параметре« класс ». – Spaideri

+0

Это правильно - если вы укажете параметр 'class', фабричный метод должен быть статическим методом этого класса, как это видно при создании' validatorFactory'. –

0

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

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

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

Привет!Метод buildDefaultValidatorFactory является статическим методом класса javax.validation.Validation – Spaideri