【问题标题】:Spring-Boot: How do I reference application.properties in an @ImportResourceSpring-Boot:如何在 @ImportResource 中引用 application.properties
【发布时间】:2014-02-23 13:51:34
【问题描述】:

我的 Spring Boot 应用程序中有一个 applicationContext.xml 文件。在这个文件中,它有一个属性占位符 - ${profile.services.url} - 用于配置 bean 的“地址”属性。

在我的 Application.java 类中,我导入了这个文件。

@ImportResource("classpath:applicationContext.xml")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我在 application.properties 中定义了“profile.services.url”。但是,在我的 XML 文件中构建 bean 时无法识别它。我已经尝试添加以下内容,但它似乎不起作用。

<context:property-placeholder location="classpath:application.properties"/>

关于如何让@ImportResource 识别Spring Boot 的属性支持有什么建议吗?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    我有以下代码:

    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 + '\'' +
                    '}';
        }
    
    }
    

    我有一个 Spring XML 配置文件,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>
    

    我有以下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>
    

    最后,我有两个.properties 文件,another.propertiesapplication.properties

    # application.properties 
    some.property=Test
    

    和..

    # another.properties 
    name.property=Another
    

    当我运行它时,输出是:

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

    这似乎可行。

    我不太确定我是否理解错误。您能否详细说明或确认这对您来说似乎是令人满意的行为?

    【讨论】:

    • 感谢 Josh - 我能够使用它来证明该属性正在从 application.properties 中设置(和读取)。我现在遇到的问题类似于stackoverflow.com/questions/19748499/…。换句话说, 的“地址”属性似乎在运行时被重新评估,并且此时没有属性替换。
    【解决方案2】:

    我能够通过在 JavaConfig 而不是 XML 中配置我的 Soap 服务来解决我的问题:

    @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() { ... }
    

    【讨论】:

      猜你喜欢
      • 2016-08-01
      • 2019-10-31
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2017-08-07
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多