Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring—使用属性占位符加载war文件或类路径之外但在文件系统中的属性文件_Java_Spring_Spring Mvc_Properties_Autowired - Fatal编程技术网

Java Spring—使用属性占位符加载war文件或类路径之外但在文件系统中的属性文件

Java Spring—使用属性占位符加载war文件或类路径之外但在文件系统中的属性文件,java,spring,spring-mvc,properties,autowired,Java,Spring,Spring Mvc,Properties,Autowired,我已经按照如下所示配置了属性文件的加载(Spring3.1) 我的SpringXML <context:component-scan base-package="com.mypackage"/> <context:property-placeholder location="file:///C:/temp/application.properties"/> 在我的java类中,我声明了如下属性: private @Value("${expirationOffset}")

我已经按照如下所示配置了属性文件的加载(Spring3.1)

我的SpringXML

<context:component-scan base-package="com.mypackage"/>
<context:property-placeholder location="file:///C:/temp/application.properties"/>
在我的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>

上下文配置位置
/WEB-INF/my spring xml
并将其移动到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>

org.springframework.web.context.ContextLoaderListener
我的服务
org.springframework.ws.transport.http.MessageDispatcherServlet
上下文配置位置
/WEB-INF/my spring xml
上面的更改似乎已经修复,因为我现在得到了正确的值。我认为我最初的方式是将它放在应用程序上下文中,这意味着它将在整个应用程序/webapp中可用

在我上面列出的3种模式中,msm弹簧有什么区别

编辑:

您是否尝试将setter方法与
#{expirationOffset}
一起使用

i、 e:

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" />
您必须添加
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.xsd
到上下文配置xml中的xsi:schemalocation

这肯定有用


希望有帮助。:)

根据您提供的信息,这是一种推测:


您可能没有
,我只是尝试了一下,它正在打印“VALUE-#@VALUE${expirationOffset}”作为输出。在我看来,spEL没有被解释。我的错,再次检查答案….:(在“@Value”里面不应该有“@Value”:(我的情况正好相反。属性占位符被定义为org.springframework.ws.transport.http.MessageDispatcherServlet servlet的参数值,但不是参数值。我移动了它,现在可以看到这些值。请参阅原始帖子中的编辑。很酷,我已经根据这些信息更新了答案。这不起作用的原因是什么可能是因为PropertyPlaceHolderConfigure是一个BeanFactoryPostProcessor,并在其定义的上下文中解析占位符-在本例中是根上下文,而不能在Web上下文中解析占位符。因此,如果我想从根Web应用程序上下文配置加载属性并[Dispatcher]Servlet上下文中的bean必须注入这些属性值,那么就没有办法了?建议我在定义/扫描使用这些属性的bean的同一配置文件中加载属性文件吗?
private String propertyValue;
@Value("#{expirationOffset}")
    public void setPropertyValue(String property) {
        propertyValue = property;
    }
<util:properties id="myProps" location="file:///C:/temp/application.properties" />
<util:properties id="myProps" location="classpath:application.properties" />
private String propertyValue;
@Value("#{myProps.expirationOffset}")
    public void setPropertyValue(String property) {
        propertyValue = property;
    }