Spring - 使用property-placeholder加载war文件或类路径之外但属于文件系统的属性文件

时间:2012-06-21 15:10:57

标签: java spring spring-mvc properties autowired

我已经配置了属性文件的加载,如下所示(Spring 3.1)

我的 - 弹簧 - XML

<context:component-scan base-package="com.mypackage"/>
<context:property-placeholder location="file:///C:/temp/application.properties"/>

的web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>       
        /WEB-INF/my-spring-xml
        </param-value>
    </context-param>

application.properties

expirationOffset = 777

在我的java类中,我已声明属性如下:

private @Value("${expirationOffset}") String propertyValue;

由于某种原因,该值未被初始化。当我运行以下语句时:

System.out.println("VALUE - " + propertyValue);

输出始终为

16:03:02,355 INFO  [stdout] (http--127.0.0.1-8080-1) VALUE - ${expirationOffset}

我试图将属性文件移动到war文件中以尝试在类路径中访问它但仍然是同样的问题。以下是我从类路径访问它的方法。

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

理想情况下,我希望将属性文件保留在war文件之外,因为我不希望重建war文件,因为属性更改很简单。

我错过了什么吗?

修改

我从这个上下文中删除了msm-spring.xml初始化参数:

<context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>       
            /WEB-INF/my-spring-xml
            </param-value>
        </context-param>

并将其移动到servlet上下文,如下所示。

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>myservice</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
            /WEB-INF/my-spring-xml
            </param-value>          
        </init-param>
    </servlet>

上述更改似乎已修复,因为我现在正在获得正确的值。我认为我最初的方式是我在应用程序上下文中拥有它,这意味着它将在整个应用程序/ webapp中可用。

在上面列出的3个中的任何一个中使用msm-spring有什么区别?

2 个答案:

答案 0 :(得分:3)

根据您提供的信息,这是一些猜测:

您的根Web应用程序上下文中可能没有<context:property-placeholder.. - 由ContextLoaderListener加载的上下文,而您可能在Web上下文中使用它(由Dispatcher servlet加载)。你能否证实这一点。

更新:根据评论,问题似乎是<context:propert-placeholder..已在Root Web应用程序上下文中定义,但在Web Context中的组件中引用。

修复是在这种情况下将propertyplaceholder移动到Web上下文(通过MessageDispatcherServlet定义的一个)。

答案 1 :(得分:2)

编辑:

您是否尝试将setter方法与#{expirationOffset} ??

一起使用

即。 :

private String propertyValue;
@Value("#{expirationOffset}")
    public void setPropertyValue(String property) {
        propertyValue = property;
    }

另一种选择:

添加属性bean而不是PropertyPlaceConfigurer,如下所示:

<util:properties id="myProps" location="file:///C:/temp/application.properties" />

OR

<util:properties id="myProps" location="classpath:application.properties" />

替换Setter稍作修改

private String propertyValue;
@Value("#{myProps.expirationOffset}")
    public void setPropertyValue(String property) {
        propertyValue = property;
    }

您必须在上下文配置xml中将xmlns:util="http://www.springframework.org/schema/util"添加到xmlns个decalrations并将http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsdxsi:schemalocation相关联。

这绝对有用。

希望它有所帮助。 :)