Kontext: Eigenschaften-Platzhalter löst keine Referenzen auf

8

Ich habe die nächste applicationContext.xml Datei im Stammverzeichnis von classpath:

%Vor%

props/datasource.properties existiert auch im Stammverzeichnis des Klassenpfads mit folgendem Inhalt:

%Vor%

Ich habe einen federverwalteten Test, bei dem ich die Verwendung der zuvor erwähnten Datei "applicationContext.xml" über die folgenden Anmerkungen erklären möchte:

%Vor%

Wenn ich die Testmethode aufrufe, bekomme ich den nächsten Fehler vom Frühling:

%Vor%

Wie ich verstehe, hat sping den Verweis auf jdbc.driverclass nicht aufgelöst. Was habe ich falsch gemacht?

PS: Ich benutze Feder 3.2.3.RELEASE

**

BEARBEITEN

**

Vielleicht liegt das Problem in MapperScannerConfigurer . Es ist ein BeanDefinitionRegistryPostProcessor und wie Javadoc sagt:

  

Erweiterung des Standard BeanFactoryPostProcessor SPI,   Zulassen der Registrierung weiterer Bean-Definitionen    bevor die normale BeanFactoryPostProcessor-Erkennung eintritt

So MapperScannerConfigurer instanziiert das Datenquellenobjekt über sqlSessionFactory, wobei BeanFacoryPostProcessor (welches für <context:property-placeholder/> verantwortlich ist) nicht verwendet wurde. Also meine Frage transformiert, um BeanFacoryPostProcessor von <context:property-placeholder/> und BeanDefinitionRegistryPostProcessor ( MapperScannerConfigurer ) neu zu ordnen?

Gelöst

Nach einigen Stunden der Untersuchung fand ich die Lösung:

Wie bereits erwähnt, ist MapperScannerConfigurer ein BeanDefinitionRegistryPostProcessor , das vor BeanFactoryPostProcessor ausgelöst wird, was für <context:property-placeholder/> verantwortlich ist. Während der Erstellung von MapperScannerConfigurer werden Verweise auf externe Eigenschaften nicht aufgelöst. In diesem Fall müssen wir die Erstellung der Datenquelle auf die Zeit verschieben, nachdem BeanFactoryPostProcessor angewendet wurde. Wir können das auf verschiedene Arten tun:

  • Entfernen Sie p:sqlSessionFactory-ref="sqlSessionFactory" von MapperScannerConfigurer . In diesem Fall wird das Datenquellenobjekt nicht vor MapperScannerConfigurer erstellt, sondern nach BeanFactoryPostProcessor , das für <context:property-placeholder/> verantwortlich ist. Wenn Sie mehr als eine sqlSessionFactory in applicationContext haben, können einige Probleme auftreten
  • In Versionen des mybatis-spring-Moduls höher als 1.0.2 besteht die Möglichkeit, sqlSessionFactoryBeanName anstelle von sqlSessionFactory zu setzen. Es hilft, das PropertyPlaceHolder-Problem mit BeanFactoryPostProcessor zu lösen. Es ist ein empfohlener Weg, um dieses Problem zu lösen, das im mybatis-spring Dokument beschrieben wird
maks 07.07.2013, 13:30
quelle

2 Antworten

0

Ich hatte das gleiche Problem und stieß auf diesen Beitrag, aber ich konnte es nicht auf die gleiche Weise lösen wie maks. Am Ende funktionierte es für mich, den ignoreUnresolvablePlaceholders-Eigenschaftswert auf true zu setzen.

%Vor%

Ich benutze auch Spring 3.2.3.RELEASE. Ich weiß, dass dieser Beitrag über 4 Monate alt ist, aber ich denke, dass jemand es nützlich finden könnte.

    
Dan 22.11.2013 19:35
quelle
0

Kurzform: Was ist der richtige Weg, um eine Implementierung von: BeanDefinitionRegistryPostProcessor zu laden?

Erweiterte Form: Gibt es eine Möglichkeit, BeanDefinitionRegistryPostProcessor zu laden, bevor irgendwelche Beans erstellt wurden. Wenn Sie das Javadoc betrachten:

  

Erweiterung auf den Standard {@ Link BeanFactoryPostProcessor} SPI unter Berücksichtigung von     die Registrierung weiterer Bean-Definitionen vor regulär     Die BeanFactoryPostProcessor-Erkennung wird gestartet.

Es ist also beabsichtigt, geladen zu werden, wenn Bean-Definitionen erstellt wurden, aber bevor irgendwelche Beans erstellt wurden. Wenn wir es nur als reguläre Bean in der Anwendung xml erstellen, wird der Zweck, diese Bean überhaupt zu verwenden, nicht erfüllt.

    
VIDIMI 30.03.2016 23:37
quelle

Tags und Links