web-dev-qa-db-fra.com

Initialisation du bean Spring à partir d'une méthode statique d'une autre classe?

J'essayais de créer un bean Hibernate Validator et je rencontrais ce problème en créant un bean à partir d'une méthode de fabrique statique dans une autre classe. J'ai trouvé un moyen printanier d'initialiser mon bean Validator (solution en bas), mais le problème lui-même reste non résolu. Validator est utilisé ici comme exemple.

Voici comment je crée l'instance Validator en Java

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

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

Voici comment j'ai essayé de créer le bean dans 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" />

Ce que je comprends, c’est que dans "factory-method", vous ne pouvez accéder qu’aux méthodes statiques définies dans la classe définie dans le paramètre "class". Puisque la méthode buildDefaultValidatorFactory () est statique, je ne peux pas créer une instance de Validation et la donner comme "bean-bean" pour le validatorFactory comme ceci:

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

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

Cela finit par un message d'erreur 

"Vérifier qu’une méthode portant le nom spécifié existe et qu’elle est non-statique "

La question est de savoir comment créer des haricots dans ce genre de situation au printemps.

Voici comment j'ai résolu le problème du validateur:

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

Le factory-method doit uniquement contenir le nom de la méthode, sans inclure le nom de la classe.

Si vous voulez utiliser une fabrique statique, donnez la class de la fabrique (!) À la déclaration de bean, si vous voulez utiliser une fabrique d'instance, donnez le factory-bean à la déclaration de bean, mais ne spécifiez pas les deux le haricot créé n'est pas indiqué dans la déclaration du haricot.

Ainsi, un exemple complet devrait ressembler à ceci: utiliser une fabrique statique pour validatorFactory et une fabrique d'instance pour validator:

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

<bean id="validator" 
    factory-bean="validatorFactory"
    factory-method="getValidator" />

Voir les détails sur la documentation:

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class-static-factory-method

Pour répondre à ta question - Comment créerais-tu du haricot dans ce genre de situation au printemps? - Faites-le exactement comme indiqué ici ou, si vous le pouvez, utilisez une classe d'utilitaires telle que LocalValidatorFactoryBean, ce qui simplifie la configuration Spring.

48
Christian Semrau

Avez-vous essayé cela?

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

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