wake-up-neo.net

Spring Bean aus statischer Methode von einer anderen Klasse initialisieren?

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

So erstelle 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();

So habe ich versucht, die Bean in applicationContext.xml zu erstellen

<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 ist, dass in "factory-method" nur auf statische Methoden zugegriffen werden kann, die in der im Parameter "class" definierten Klasse definiert sind. Da die Methode buildDefaultValidatorFactory () statisch ist, kann ich keine Validierungsinstanz erstellen und als "factory-bean" für die validatorFactory wie folgt angeben:

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

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

Dies führt zu einer Fehlermeldung 

"Überprüfen Sie, ob eine Methode mit dem angegebenen Namen existiert und nicht statisch "

Die Frage ist, wie würdest du in dieser Situation im Frühling eine Bohne schaffen?

So habe ich das Validator-Problem gelöst:

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

Der factory-method sollte nur den Methodennamen enthalten, nicht den Klassennamen.

Wenn Sie eine statische Factory verwenden möchten, geben Sie der Bean-Deklaration die class der Factory (!) An. Wenn Sie eine Instanz-Factory verwenden möchten, geben Sie der Bean-Deklaration den factory-bean, geben Sie jedoch nicht beides an: Die Klasse von Die erstellte Bean wird in der Bean-Deklaration nicht angegeben.

Ein vollständiges Beispiel sollte also folgendermaßen aussehen: Verwenden einer statischen Factory für validatorFactory und einer Instanzfactory für validator:

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

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

Siehe Details zur Dokumentation:

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

Um Ihre Frage zu beantworten - Wie würden Sie in dieser Situation im Frühling eine Bean kreieren? - Machen Sie es genau wie hier gezeigt, oder verwenden Sie, falls möglich, eine Dienstprogrammklasse wie LocalValidatorFactoryBean, die die Spring-Konfiguration vereinfacht.

48

Hast du das probiert?

<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