无法打开 ServletContext 资源

40

我有一个WAR包。

这个问题与一个老问题非常相似,但解决方案对我没有用。

web.xml中:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:application-context.xml</param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
application-context.xml 文件中。
<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>classpath:social.properties</value>
    </property>
</bean>

但是我得到了这个:

org.springframework.beans.factory.BeanInitializationException: 无法加载属性;嵌套异常为 java.io.FileNotFoundException: 无法打开 ServletContext 资源 [/social.properties]

我检查了WAR包 - .xml.properties 文件都在 /WEB-INF/classes

.properties 文件在 src/main/resources 中,.xml 文件在 src/main/java 中(两者都在默认包中),而Maven 工具将它们正确地传输到 WEB-INF/classes 的默认包中(我认为)

有谁知道为什么我会收到这个异常?谢谢。

编辑:我只想补充说,JUnit 测试通过了(我的意思是它们从 social.properties 加载了应该加载的内容),但运行应用程序时它忽略了我的 classpath: 前缀。


1
你确定 classpath: 前缀实际上存在吗? - axtavt
1
是的,在构建完成后,它告诉我 /home/...-DEVELOPMENT-0.0.1.war 构建成功。当我打开 war 文件并查看 /WEB-INF/classes/application-context.xml 时,我看到了 classpath: 前缀。 - kuncajs
1
@Michael 不,它应该放在“类”中。 - jmj
它可以去你告诉它去的任何地方。默认情况下,它在/WEB-INF目录下。 - Bozho
1
我刚刚上传了精简版(删除了库文件)的war包到我的大学网页[链接]http://fi.muni.cz/~xkunc7/develop.war,如果有人需要的话(我指的是我自己:-))。 - kuncajs
显示剩余6条评论
8个回答

36

不要使用classpath。这可能会导致不同的类加载器(容器与应用程序)出现问题。WEB-INF始终是更好的选择。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-config.xml</param-value>
</context-param>
并且
<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="location">
         <value>/WEB-INF/social.properties</value>
     </property>
</bean>

我们如何使用BufferedWriter来处理以这种方式加载的文件? - user1685185
1
@user75782131,您可以尝试使用 getServletContext().getRealPath("/WEB-INF/somefile.txt") - Roman K
由于文件在类中,应该使用<param-value>/WEB-INF/classes/spring-config.xml</param-value>。 - user2505915

17

将像 /src/main/resources/foo/bar.properties 这样的内容放置好,然后将它们引用为 classpath:/foo/bar.properties


我在属性中有一个JSON文件路径。 - Pavan

8

0

尝试使用这段代码...

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
         <property name="ignoreUnresolvablePlaceholders" value="true"/>
             <property name="locations">
              <list>                        
                    <value>/social.properties</value>               
              </list>
         </property>         
        </bean>

0

确保属性文件在“/WEB-INF/classes”中,尝试使用

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>/WEB-INF/classes/social.properties</value>
    </property>
</bean>

0

我认为目前application-context.xml文件位于src/main/resources,而social.properties文件位于src/main/java...所以当你打包(mvn package)或运行tomcat(mvn tomcat:run)时,你的social.properties会消失(我知道你说过在.war中检查文件在这里...但你的异常信息却相反)。

解决方案很简单,只需将所有配置文件(application-context.xml和social.properties)放入src/main/resources中,以遵循maven标准结构。


0

你是否让Tomcat解压WAR文件?当加载WAR文件且未被解压时,似乎无法在类路径上找到文件。


0

我遇到了同样的错误。

我的文件名是jpaContext.xml,放在src/main/resources目录下。我指定了参数value="classpath:/jpaContext.xml"

最后,我将文件重命名为applicationContext.xml,并将其移动到WEB-INF目录,并将参数值更改为/WEB-INF/applicationContext.xml,然后它就正常工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接