2

我已经配置了属性文件的加载,如下所示(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>

应用程序属性

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 有什么区别?

4

2 回答 2

3

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

您可能没有<context:property-placeholder..在您的根 Web 应用程序上下文中 - 由 ContextLoaderListener 加载的那个,相反,您可能在 Web 上下文中拥有它(由 Dispatcher servlet 加载)。你能确认一下吗?

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

在这种情况下,修复方法是将属性占位符移动到 Web 上下文(通过 MessageDispatcherServlet 定义的上下文)。

于 2012-06-21T16:50:49.170 回答
2

编辑 :

您是否尝试过使用 setter 方法#{expirationOffset}

IE :

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

另外一个选项 :

添加 Properties bean 而不是 PropertyPlaceConfigurer 像这样:

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

或者

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

并将 Setter 稍作修改替换为

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

您必须在上下文配置 xml 中添加decalrations 和xmlns:util="http://www.springframework.org/schema/util"相应xmlns的内容。http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsdxsi:schemalocation

这绝对应该有效。!

希望能帮助到你。:)

于 2012-06-21T16:07:13.487 回答