Spring 過濾器DelegatingFilterProxy No WebApplicationContext found: no ContextLoaderListener registered?

普羅旺斯s發表於2020-11-07


//                       _ooOoo_                          //
//                      o8888888o                         //
//                      88" . "88                         //
//                      (| ^_^ |)                         //
//                      O\  =  /O                         //
//                   ____/`---'\____                      //
//                 .'  \\|     |//  `.                    //
//                /  \\|||  :  |||//  \                   //
//               /  _||||| -:- |||||-  \                  //
//               |   | \\\  -  /// |   |                  //
//               | \_|  ''\---/''  |   |                  //
//               \  .-\__  `-`  ___/-. /                  //
//             ___`. .'  /--.--\  `. . ___                //
//           ."" '< `.___\_<|>_/___.' >'"".               //
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |            //
//         \  \ `-.   \_ __\ /__ _/   .-` /  /            //
//  ========`-.____`-.___\_____/___.-`____.-`========     //
//                       `=---='                          //
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    //
//          佛祖保佑       永無BUG     永不修改               //

專案場景:

在web.xml配置springMVC相關屬性時出現報錯


問題描述:

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?


原因分析:

該錯誤說明ContextLoaderListener 沒有註冊,需要在web.xml檔案中新增org.springframework.web.context.ContextLoaderListener,具體可以參看


解決方案:

執行順序問題

方法一

報錯配置

<!--配置springMVC-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定配置檔案位置和名稱 如果不設定,預設找/WEB-INF/<servlet-name>-servlet.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
    </servlet>

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

正確配置

<!--配置springMVC-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定配置檔案位置和名稱 如果不設定,預設找/WEB-INF/<servlet-name>-servlet.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <!-- 就是這裡 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  1. load-on-startup元素標記容器是否在啟動的時候就載入這個servlet(例項化並呼叫其init()方法)。
  2. 它的值必須是一個整數,表示servlet應該被載入的順序
  3. 當值為0或者大於0時,表示容器在應用啟動時就載入並初始化這個servlet;
  4. 當值小於0或者沒有指定時,則表示容器在該servlet被選擇時才會去載入。
  5. 正數的值越小,該servlet的優先順序越高,應用啟動時就越先載入。
  6. 當值相同時,容器就會自己選擇順序來載入。

所以,<load-on-startup>X</load-on-startup>,中X的取值1,2,3,4,5代表的是優先順序,而非啟動延遲時間

方法二

把這塊配置放到最前面去

<!--配置springMVC-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定配置檔案位置和名稱 如果不設定,預設找/WEB-INF/<servlet-name>-servlet.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
    </servlet>

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

推薦兩個文章

web.xml 中的listener、 filter、servlet 載入順序及其詳解
org.springframework.web.context.ContextLoaderListener

相關文章