Kann nicht die richtige Antwort auf die nächste Situation im Internet finden. Also, wenn es schon diskutiert wurde, nur darauf hinweisen.@PropertySource() funktioniert nicht in Bean definiert in XML importiert von @ImportResource()
I Jave Unittest, der von Frühling ausgeführt wird:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/app-core-config.xml")
public class ConcurrentProcessingTest extends AbstractLSTest {
public void testMethod1(){
...
}
}
spring/app-core-config.xml
enthält einige Bohnen, die @PropertySource
verwenden.
Zum Beispiel Service1Impl
:
@Service
@PropertySource("classpath:system/service1.properties")
public class Service1Impl {
@Value("${event.ack.warning}")
private String eventAckWarningComm;
@Value("${event.ack.info}")
private String eventAckInfoComm;
}
So wenige Klassen mit ähnlicher Nutzung von @PropertySource
sind in spring/app-core-config.xml
definiert.
Wenn ich erwähnten UnitTest ausgeführt wird, funktioniert alles gut.
Aber ich brauche einige zusätzliche Java-Konfiguration für bestimmte UnitTest. Also, ich geschrieben nächste einfache Konfiguration für vorherige Unittest:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ConcurrentProcessingTest.AppCoreConfiguration.class})
public class ConcurrentProcessingTest extends AbstractLSTest {
@Configuration
@ImportResource("classpath:spring/app-core-config.xml")
//@PropertySource("classpath:system/service1.properties") -- if uncommented, UT works
//But it is annoying to add all propery-files here
static class AppCoreConfiguration {
//Here I want to add extra configuration in Java style
}
public void testMethod1(){
...
}
}
Aber wenn ich diese Unittest laufen, bekomme ich nächste Ausnahme:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'event.ack.warning' in string value "${event.ack.warning}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:194)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:158)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:175)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:800)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:871)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 184 more
Könnte mir jemand erklären, warum @PropertySource
nicht in Bohne arbeiten definiert in XML importiert von @ImportResource
?
'@ PropertySource' wird statisch propertySourcesPlaceHolderConfigurer Bohne erklären, nur auf Bohnen arbeiten kommentierte mit' @ Configuration' nicht einer beliebigen andere Bohnen. –
@M Hm .... aber in reiner XML-Konfiguration @PropertySource funktioniert für Beans (Services) sehr gut. Ist es ein Fehler in der @ImportResource() -Funktionalität? –
Nein, es sollte nicht, und sollte es auch nicht für andere Arten von Beans funktionieren, da die 'PropertySource' in' ConfigurationClassParser' verarbeitet wird, würde ich '' PropertySource' 'für etwas anderes als eine '@Configuration' Klasse definieren und lesen ist ein Fehler. Es ist nicht sinnvoll, '@ PropertySource' in etwas anderem als einer' @Configuration'-Klasse zu verwenden, da dies konfigurationsbezogen und nicht auf Service oder irgendetwas anderes bezogen ist. –