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

Я пытался создать Hibernate Validator bean и столкнулся с этой проблемой, создав 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" />

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

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

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

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

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

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

вот как я решил проблему валидатора:

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

2 ответов


на 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

чтобы ответить на этот вопрос - как бы вы создали фасоль в такой ситуации весной? - сделайте это точно так, как показано здесь, или, если можете, используйте класс утилиты, например LocalValidatorFactoryBean, что упрощает конфигурацию пружины.


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

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

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