2012-03-27 16 views
37

Stavo cercando di creare bean Hibernate Validator e mi sono imbattuto in questo problema nella creazione di un bean dal metodo factory statico in un'altra classe. Ho trovato un modo per far inizializzare il mio bean Validator (soluzione in fondo), ma il problema rimane irrisolto. Il validatore è usato come esempio qui.Inizializzazione del bean Spring dal metodo statico di un'altra classe?

Ecco come ho creato l'istanza Validator in Java

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

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

Ecco come ho cercato di creare il fagiolo in 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" /> 

Quello che ho capito è che in "fabbrica metodo "è possibile accedere solo ai metodi statici definiti nella classe definita nel parametro" classe ". Dal momento che il metodo buildDefaultValidatorFactory() è statico non posso creare un'istanza di convalida e dare come "fabbrica-bean" per il validatorFactory come questo:

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

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

Questo finisce al messaggio di errore

" verificare che un metodo con il nome specificato esiste e che è non statico "

domanda è come si dovrebbe creare fagiolo in questo tipo di situazione in primavera?

Ecco come ho risolto il problema Validator:

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

risposta

46

Il factory-method dovrebbe contenere solo il nome del metodo, che non includono il nome della classe.

Se si desidera utilizzare una fabbrica statica, dare il class della fabbrica (!) Per la dichiarazione di fagioli, se si desidera utilizzare una fabbrica di esempio, dare la factory-bean alla dichiarazione di fagioli, ma non danno sia : La classe del bean creato non è indicata nella dichiarazione bean.

Quindi un esempio completo dovrebbe essere simile, utilizzando una fabbrica statico per validatorFactory e una fabbrica di istanza per validator:

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

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

Vedere i dettagli sulla documentazione:

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

Per rispondere tu domanda - Come creeresti il ​​fagiolo in questo tipo di situazione in primavera? - Esegui esattamente come mostrato qui, o se possibile, usa una classe di utilità come la LocalValidatorFactoryBean, che semplifica la configurazione di Spring.

+0

Il nome di classe è lì per dimostrare cosa volevo fare. Come ho detto "Quello che capisco è che in" metodo di fabbrica "è possibile accedere solo ai metodi statici definiti nella classe definita nel parametro" classe "." – Spaideri

+0

Corretto: se si assegna il parametro 'class', il metodo factory deve essere un metodo statico di quella classe, come mostrato nella creazione di' validatorFactory'. –

0

Hai provato questo?

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

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

Ciao!method buildDefaultValidatorFactory è un metodo statico di Classe javax.validation.Validation – Spaideri