web.xml文件報錯:cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'

報錯現(xiàn)場還原

web.xml文件頭部聲明如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

報錯的 servlet 元素如下:

<servlet>
    <description>Enter Dispatcher</description>
    <servlet-name>xxxMVC</servlet-name>
    <servlet-class>com.xxx.web.servlet.RequestDispatcher</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
        <param-name>xxxName</param-name>
        <param-value>xxxValue</param-value>
    </init-param>
</servlet>

報錯提示在 <init-param> 那一行,具體報錯內(nèi)容如下:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://xmlns.jcp.org/xml/ns/javaee":enabled, 
 "http://xmlns.jcp.org/xml/ns/javaee":async-supported, "http://xmlns.jcp.org/xml/ns/javaee":run-as, "http://xmlns.jcp.org/xml/ns/javaee":security-
 role-ref, "http://xmlns.jcp.org/xml/ns/javaee":multipart-config}' is expected.

解決方法

init-param 元素整體移動到 load-on-startup 元素之前,修改后,內(nèi)容如下:

<servlet>
    <description>Enter Dispatcher</description>
    <servlet-name>xxxMVC</servlet-name>
    <servlet-class>com.xxx.web.servlet.RequestDispatcher</servlet-class>
    <init-param>
        <param-name>xxxName</param-name>
        <param-value>xxxValue</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

報錯原因分析

因為是 servlet 元素報錯,所以,我們嘗試找到對應的xsd文件,來看下報錯的地方違反了哪條限制或約束。根據(jù)xml文件頭部聲明,我們知道對應的xsd文件是 http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd ,但是從 web-app_3_1.xsd 文件中,我們并沒有找到對應的約束定義。但是,我們發(fā)現(xiàn)如下代碼片段:

<xsd:include schemaLocation="web-common_3_1.xsd"/>

所以,我們嘗試繼續(xù)在 web-common_3_1.xsd 中尋找對應的限制或約束,我們找到如下兩個代碼片段:

<xsd:element name="servlet" type="javaee:servletType"/>
<xsd:complexType name="servletType">
    ......
    <xsd:sequence>
        ......
        <xsd:element name="init-param"
                     type="javaee:param-valueType"
                     minOccurs="0"
                     maxOccurs="unbounded"/>
        <xsd:element name="load-on-startup"
                     type="javaee:load-on-startupType"
                     minOccurs="0">
        </xsd:element>
        ......
    </xsd:sequence>
    ......
</xsd:complexType>

從上面兩段代碼,我們知道,針對 servlet 元素,通過 <xsd:sequence> 限制了子元素的出現(xiàn)順序,init-param 必須出現(xiàn)在 load-on-startup 之前。到這里,我們終于明白了錯誤的原因是我們將子元素的前后順序設置錯了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 本章聊一聊ServletContext 3.0規(guī)范中定義的注解以及在web應用中使用的框架和庫的可插拔性的提升。 ...
    Lucky_Micky閱讀 6,180評論 0 3
  • 對于java中的思考的方向,1必須要看前端的頁面,對于前端的頁面基本的邏輯,如果能理解最好,不理解也要知道幾點。 ...
    神尤魯?shù)婪?/span>閱讀 900評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • Linux 上的壓縮包文件格式,除了 Windows 最常見的*.zip、*.rar、.7z 后綴的壓縮文件,還有...
    e9f3ca3721bc閱讀 2,947評論 0 0
  • 干活 干了一下午活,好累!但很充實!?。?/div>
    傅深釗傅深釗閱讀 219評論 0 1

友情鏈接更多精彩內(nèi)容