Spring-Boot: How do I reference application.properties in an @ImportResource

前端 未结 2 446
盖世英雄少女心
盖世英雄少女心 2021-01-04 10:32

I have an applicationContext.xml file in my Spring Boot application. In this file, it has a property placeholder - ${profile.services.url} - that\'s used to configure the \"

相关标签:
2条回答
  • 2021-01-04 11:04

    I've got the following code:

    package demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    
    import java.util.Collection;
    
    @ComponentScan
    @EnableAutoConfiguration
    public class Application {
    
        public static void main(String[] args) {
            ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
            Collection<Foo> shouldBeConfigured = applicationContext.getBeansOfType(Foo.class).values();
            System.out.println(shouldBeConfigured.toString());
        }
    }
    
    @Configuration
    @ImportResource("/another.xml")
    class XmlImportingConfiguration {
    }
    
    class Foo {
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Foo{" +
                    "name='" + name + '\'' +
                    '}';
        }
    
    }
    

    I have a Spring XML configuration file, another.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:property-placeholder location="another.properties" />
    
        <!-- this property value is defined in another.properties, which we install in this XML file
        -->
        <bean class="demo.Foo" >
            <property name="name" value="${name.property}"/>
        </bean>
    
        <!-- this property value is defined in application.properties, which Spring Boot automatically installs for us.
        -->
        <bean class="demo.Foo" >
            <property name="name" value="${some.property}"/>
        </bean>
    
    </beans>
    

    I have the following pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.demo</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <name>demo</name>
        <description>Demo project</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.0.0.RC1</version>
        </parent>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <properties>
            <start-class>demo.Application</start-class>
            <java.version>1.7</java.version>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>http://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>http://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>http://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
            <pluginRepository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>http://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    
    </project>
    

    Finally, I have two .properties files, another.properties, and application.properties:

    # application.properties 
    some.property=Test
    

    and..

    # another.properties 
    name.property=Another
    

    When I run this, the output is:

    [Foo{name='Another'}, Foo{name='Test'}]

    Which would seem to work.

    I'm not quite sure I am understanding the error. Can you elaborate, or confirm this seems satisfactory behavior for you, too please?

    0 讨论(0)
  • 2021-01-04 11:10

    I was able to workaround my issue by configuring my Soap service in JavaConfig instead of XML:

    @Value("${profile.services.url}")
    private String profileServiceUrl;
    
    @Bean
    public ProfileSoapService profileSoapService() {
        final JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        jaxWsProxyFactoryBean.setServiceClass(ProfileSoapService.class);
        jaxWsProxyFactoryBean.setAddress(profileServiceUrl);
        jaxWsProxyFactoryBean.getOutInterceptors().add(getSecurityInterceptor());
        return (ProfileSoapService) jaxWsProxyFactoryBean.create();
    }
    
    
    private WSS4JOutInterceptor getSecurityInterceptor() { ... }
    
    0 讨论(0)
提交回复
热议问题