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

报错现场还原

web.xml文件头部声明如下:



报错的 servlet 元素如下:


    Enter Dispatcher
    xxxMVC
    com.xxx.web.servlet.RequestDispatcher
    1
    
        xxxName
        xxxValue
    

报错提示在 那一行,具体报错内容如下:

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 元素之前,修改后,内容如下:


    Enter Dispatcher
    xxxMVC
    com.xxx.web.servlet.RequestDispatcher
    
        xxxName
        xxxValue
    
    1

报错原因分析

因为是 servlet 元素报错,所以,我们尝试找到对应的xsd文件,来看下报错的地方违反了哪条限制或约束。根据xml文件头部声明,我们知道对应的xsd文件是 http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd ,但是从 web-app_3_1.xsd 文件中,我们并没有找到对应的约束定义。但是,我们发现如下代码片段:


所以,我们尝试继续在 web-common_3_1.xsd 中寻找对应的限制或约束,我们找到如下两个代码片段:



    ......
    
        ......
        
        
        
        ......
    
    ......

从上面两段代码,我们知道,针对 servlet 元素,通过 限制了子元素的出现顺序,init-param 必须出现在 load-on-startup 之前。到这里,我们终于明白了错误的原因是我们将子元素的前后顺序设置错了。

你可能感兴趣的:(web.xml文件报错:cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param')