通过XML

时间:2015-04-27 14:50:48

标签: java spring maven spring-mvc

我试图升级一些旧版应用程序的库,其中部分内容正从第3季度升级到第4.1.6版。我认为这是一个非常典型的配置,使用Maven来引入依赖关系,然后使用maven配置文件和过滤来选择正确的属性文件来运行应用程序。看起来像这样。

pom.xml

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <app.env>Development</app.env>
        </properties>
        <build>
            <resources>
                <resource>
                    <directory>${basedir}/src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <webResources>
                            <webResource>
                                <directory>${basedir}/src/main/webapp/WEB-INF</directory>
                                <includes>
                                    <include>web.xml</include>
                                </includes>
                                <filtering>true</filtering>
                                <targetPath>WEB-INF</targetPath>
                            </webResource>
                        </webResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

我的spring应用程序上下文位于带有PropertySourcesPlaceholderConfigurer bean定义的已过滤资源目录中。 $ {app.env}被过滤掉,由Development.properties文件加载

ApplicaitonContext.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">

    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:com/tms/edu/settings/${app.env}.properties</value>
            </list>
        </property>
    </bean>

    

我在这一点上的理解是,当使用ProperySourcesPlaceholderConfigurer而不是旧的PropertyPlaceHolderConfigurer时,它应该自动将资源注册为PropertySource,以便自动装配的Environment对象可以简单地调用getProperty(&#34; db .location&#34;)并在运行时提供。所以我应该能够在我的扫描包中有一个简单的类,基本上可以这样做:

@Service
public class PropertyReader {

    @Autowired
    private Environment env;

    public String getPropertyValue(String key) {
        return env.getProperty(urlkey);
    }
}

然而,这并不起作用。 getProperty()为一个应该工作的键返回null,并检查调试器中的环境对象我没有看到我的资源加载到propertySources列表中。

我只是找到了如何使用注释配置PropertySource的示例,但这并不能解决我们如何在maven构建中管理配置文件和属性的问题。我知道我可以使用@Value $ {}样式注释来获取这些值并且工作正常。但我仍然很好奇为什么环境不像我期望的那样工作。

1 个答案:

答案 0 :(得分:0)

如果您使用的是XML配置,请尝试添加<context:property-placeholder location="classpath:foo.properties" />或   <context:property-placeholder location="classpath:${app.env}.properties"/>

相当于@PropertySource("classpath:whatever.properties")

此命名空间启用PropertySources,请参阅here on "Using the @Value annotation"

注意:classpath可以直接引用resources文件夹,这是将您的属性设置为Maven项目的正常位置