2016-07-25 26 views
0

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?

+0

'@ PropertySource' wird statisch propertySourcesPlaceHolderConfigurer Bohne erklären, nur auf Bohnen arbeiten kommentierte mit' @ Configuration' nicht einer beliebigen andere Bohnen. –

+0

@M Hm .... aber in reiner XML-Konfiguration @PropertySource funktioniert für Beans (Services) sehr gut. Ist es ein Fehler in der @ImportResource() -Funktionalität? –

+0

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. –

Antwort

0

Nachdem Sie Ihre Klasse mit entsprechenden propertysource abgegrenzt haben, müssen Sie wie unten in der Konfigurationsklasse

@Bean 
    public static PropertySourcesPlaceholderConfigurer xxxpropertyConfig() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    }