【问题标题】:Could not open ServletContext resource [/WEB-INF/applicationContext.xml]无法打开 ServletContext 资源 [/WEB-INF/applicationContext.xml]
【发布时间】:2014-04-16 12:58:05
【问题描述】:

好的,我是第 500 个提出这个问题的用户,我阅读了很多 answers,但仍然没有运气。

父模块 pom 包含:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.framework.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.framework.version}</version>
</dependency>

子模块有maven-jetty-plugin,我用jetty:run 运行我的webapp 模块。

web.xml 定义标准调度模块:

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

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

我在WEB-INF 下有文件dispatcher-servlet.xml,但启动失败:

FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

怎么了?文档和每个人都说 Spring MVC 将搜索 XX-servlet.xml,其中 XX 是 servlet 的名称。为什么会搜索applicationContext.xml

【问题讨论】:

  • 你有一个 org.springframework.web.context.ContextLoaderListener 在你的 web.xml 中注册为 元素吗?
  • 是的,更新的问题
  • 是的,这就是问题所在。默认情况下,ContextLoaderListener 将在 /WEB-INF/applicationContext.xml 中查找 Spring 配置。只需删除 元素,一切都会正常。
  • @RobBlake 好收获!复制它以回答,以便我接受。非常感谢

标签: java spring spring-mvc


【解决方案1】:

ContextLoaderListener 有自己的上下文,由所有 servlet 和过滤器共享。默认搜索/WEB-INF/applicationContext.xml

您可以通过使用自定义它

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/somewhere-else/root-context.xml</param-value>
</context-param>

web.xml 上,或者如果您不需要,请移除此侦听器。

【讨论】:

  • 它不是共享的,而是成为父上下文或根上下文。 Servlet 上下文成为子项,因此可以在父项中看到 bean,但反之则看不到。这可能就是你的意思。
  • 这解决了一个完全不同的问题,这个问题一直困扰着我最后一天。你真好。
  • “其他地方”应该是什么 - 抱歉,我对此完全陌生?
【解决方案2】:

更新:这将创建与 applicationContext.xml 中相同的第二个上下文

或者您可以将此代码 sn-p 添加到您的 web.xml

<servlet>
    <servlet-name>spring-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

而不是

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

【讨论】:

  • 你能解释一下区别吗?解释?
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 2016-02-22
  • 2012-06-05
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
相关资源
最近更新 更多