2012-03-27 11 views
37

Ich habe versucht, Hibernate Validator-Bean zu erstellen, und habe dieses Problem beim Erstellen einer Bean aus der statischen Factory-Methode in einer anderen Klasse verursacht. Ich habe einen Spring-Weg gefunden, um meine Validator-Bean zu initialisieren (Lösung ganz unten), aber das Problem selbst bleibt ungelöst. Der Validator wird hier als Beispiel verwendet.Spring Bean von der statischen Methode aus einer anderen Klasse initialisieren?

Dies ist, wie ich die Validator-Instanz in Java

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

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

Das schaffen ist, wie ich versuchte, die Bohne 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" /> 

Was ich verstehe zu schaffen ist, dass in „Fabrik- Methode "Sie können nur auf statische Methoden zugreifen, die in der im Parameter" class "definierten Klasse definiert sind. Da das Verfahren buildDefaultValidatorFactory() statisch ist kippe ich eine Instanz von Validation erstellen und geben Sie es als „Fabrik-Bohne“ für die validatorFactory wie folgt aus:

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

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

Diese endet Nachricht

"auf Fehler überprüfen Sie, ob ein Verfahren mit dem angegebenen Namen existiert, und dass es nicht-statische "

Frage ist, wie Sie Bohne in dieser Art von Situation im Frühjahr schaffen würde? Diese

ist, wie ich das Validator Problem gelöst:

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

Antwort

46

Die factory-method nur die Methode Namen, nicht mit dem Klassennamen.

Wenn Sie eine statische Fabrik verwenden möchten, die class der Fabrik geben (!) An die Bean Erklärung, wenn Sie eine Instanz Fabrik verwenden möchten, die factory-bean auf die Bohne Erklärung geben, aber geben Sie nicht beide : Die Klasse der erstellten Bean wird in der Bean-Deklaration nicht angegeben.

So ein vollständiges Beispiel sollte so aussehen, eine statische Fabrik für validatorFactory verwenden und eine Instanz Fabrik für validator:

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

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

Siehe Details auf der Dokumentation:

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

zu beantworten Sie Frage - Wie würden Sie in dieser Art einer Situation im Frühjahr Bohne erstellen? - Tun Sie es genau wie hier gezeigt, oder wenn Sie können, verwenden Sie eine Hilfsklasse wie die LocalValidatorFactoryBean, die die Spring-Konfiguration vereinfacht.

+0

Klassenname ist da, um zu demonstrieren, was ich machen wollte. Wie ich schon sagte: "Was ich verstehe, ist, dass Sie in" factory-method "nur auf statische Methoden zugreifen können, die in der im Parameter" class "definierten Klasse definiert sind." – Spaideri

+0

Das ist richtig - wenn Sie den Parameter 'class' angeben, muss die Factory-Methode eine statische Methode dieser Klasse sein, wie in der Erstellung von' validatorFactory' zu sehen ist. –

0

Haben Sie das versucht?

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

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

Hallo!Die Methode buildDefaultValidatorFactory ist eine statische Methode der Klasse javax.validation.Validation – Spaideri