web.xml中的cvc-id.3错误

smdnsysy  于 2022-11-04  发布在  Eclipse
关注(0)|答案(6)|浏览(238)

在Eclipse中为SpringMVC Web应用程序编辑web.xml文件时,我收到了此错误消息:
cvc-id.3:标识约束“web-app-servlet-name-unioneity”的字段与元素“web-app”匹配,但此元素没有简单类型。
以下是我web.xml的一部分:

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">

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

错误点在<servlet-name>dispatcher</servlet-name>声明。我应该做什么来修复它?提前感谢你。

erhoui1w

erhoui1w1#

我意外地发现将Java更改为大写会使错误消失:
xmlns="http://java.sun.com/xml/ns/javaee"
应道:
xmlns="http://JAVA.sun.com/xml/ns/javaee"

hec6srdp

hec6srdp2#

日 eclipse 2021年6月

我今天在Eclipse 2021-06中遇到了类似的问题:
cvc-id.3:标识约束“web-common-filter-name-unique”的字段与元素“web-app”匹配,但此元素不具有简单类型。

错误答案

答案中的许多其他建议都是完全错误的,因为他们所做的是将名称空间更改为根本不再Map到任何模式的内容,因此将不再简单地检查内容。所以javaJavahttphttpsjavaeej2ee在某些地方实际上只是隐藏了问题。
关键是如果这个消息出现了,那么就真的有一个验证问题需要被发现和修复。所以虽然像清理项目,Eclipse在Windows/Preferences/Network Connections/Cache下的网络缓存等建议是通常的巫毒,他们可能(!)工作!虽然,这不是我的情况下的问题。

部署描述符3.1

在我的例子中,将部署描述符更改为3.1版本:

<web-app    xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
            id="WebApp_ID" version="3.0">

<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"
            id="WebApp_ID" version="3.1">

之后,验证错误立即消失了。不过,重要的是,与许多其他答案中引入的无效/未知/错误/...命名空间不同,Eclipse确实验证了!这可以通过两次添加相同的filter-name来轻松测试,这会导致以下错误:
CVC-identity-constrain.4.1:为元素“web-app”的标识约束“web-common-filter-name-uniquenity”声明了重复的唯一值[UrlRewriteFilter]。
这种情况不会发生在无效/未知/错误/...名称空间中,Eclipse根本不会简单地进行验证,错误将一直无法识别,直到部署或甚至更晚。

支持Tomcat+Eclipse中的3.1版

我自己也需要支持遗留应用程序,所以检查了Tomcat的哪个版本已经部署了相应的web.xml及其8.0版本。对于很多用户来说,这个版本应该已经足够老了。当然,Eclipse似乎也捆绑了这个版本很长一段时间,否则它现在就无法验证。只需查看一下文件org.eclipse.jst.standard.schemas_1.2.400.v202101070609.jar

从3.0到3.1的变更

我已经比较了两个版本,似乎人们大多数只改变了名称空间,并将一些类型从关联的web-common_*.xsd迁移到web-app_*.xsd本身。

结论

总的来说,有趣的问题是为什么Eclipse不再支持以前的web.xml,尽管它看起来是完全正确的。只有名称空间和版本号发生了变化,但在过去的几年里,它仍然有效。我现在不确定的是,如果旧的Eclipse使用语言服务器进行验证,就像当前使用的版本一样。我想知道语言服务器提供的任何东西是否已经改变,并且部署描述符的3. 0版本可能根本不再被支持。
或者关于下载和包含web-common_*.xsd的其他一些更改,这就是为什么他们需要将类型重构到父文件中。
当然,这两个问题在2010年实际编写时都不是问题。:-)尽管在我看来部署描述符仍然正确,只是对于一些旧版本,但除了错误的名称空间或类似问题外,肯定还有其他一些根本原因。

与JSP相关的更新

我在JSP中也遇到过很多这样的问题,这次只需要更改XSD的位置就足够了,而不需要更改任何名称空间或版本。后者适用于web.xml,但这次我只做了以下操作:

<taglib
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

<taglib
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd

http://xmlns.jcp.org/xml/ns/javaee/web-jsptaglibrary_2_1.xsd
重要的是我没有简单地使名称空间无效,但验证仍然适用。这可以通过添加无效元素或添加多个具有相同名称的函数来轻松测试。

cvc-complex-type.2.4.a: Invalid content was found starting with element '{"http://java.sun.com/xml/ns/javaee":foobar}'. One of '{"http://java.sun.com/xml/ns/javaee":description, "http://java.sun.com/xml/ns/javaee":display-name, "http://java.sun.com/xml/ns/javaee":icon, "http://java.sun.com/xml/ns/javaee":tlib-version}' is expected.

Eclipse中的WWD包含一些目录文件,这些目录文件将同一个XSD文件Map到多个不同的URI名称下。因此,虽然理论上旧的URI应该仍然可用并被使用,但由于某些原因,它似乎并不可用。OTOH,新的URI似乎由于某些原因而工作,但在这些情况下,有必要保留旧的名称空间!原因很简单,唯一可用的文件仍然包含旧的名称空间。而不管使用哪个URI来读取它。

<uri name="http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" uri="file:///C:/Users/tschoening/AppData/Roaming/Eclipse/Java%20Docsrv/configuration/org.eclipse.osgi/1360/0/.cp/dtdsAndSchemas/web-jsptaglibrary_2_1.xsd"/>
<uri name="http://xmlns.jcp.org/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" uri="file:///C:/Users/tschoening/AppData/Roaming/Eclipse/Java%20Docsrv/configuration/org.eclipse.osgi/1360/0/.cp/dtdsAndSchemas/web-jsptaglibrary_2_1.xsd"/>

所以,只改变URI可能也适用于web.xml,就像它似乎适用于我的JSP标记库一样。没有得到任何更新的工作,似乎标准已经改变了一点,我需要采用更多的,我不想再这样了。遗留的东西...:-)

beq87vna

beq87vna3#

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">

namespace添加到您的xmlns="http://java.sun.com/xml/ns/javaee"行(例如)xmlns:javaee="http://java.sun.com/xml/ns/javaee"可能会解决您的问题。
两个定义文件中都有元素,因此如果没有正确的名称空间,它们将不唯一

yebdmbv4

yebdmbv44#

请在下面找到web.xml的标记

<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">

</web-app>
jmo0nnb3

jmo0nnb35#

我真的很感谢托尔斯滕·舍宁的回答,以及他提出的解决问题,而不是隐藏问题的建议。
在我的例子中,由于使用了不正确的版本和描述符模式,我得到了这些验证错误。
因为我使用了Jakarta的Servlet实现
jakarta.servlet:jakarta.servlet-api:5.0.0
我不得不使用Jakarta's schema

<web-app version="5.0"
             xmlns="https://jakarta.ee/xml/ns/jakartaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
             id="webappid">

例如,必须使用Servlet 5.0版本处理的Jakarta Servlet部署描述符示例必须在示例文档的version属性中指明版本,例如“5.0”。部署描述符处理器使用版本信息选择适当版本的架构文档来处理部署描述符示例。
因此,如果您使用javax.servlet-api:3.1,那么正确的描述符也应该使用相应的版本。

<web-app version="3.1"
         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"
         id="webappid">
afdcj2ne

afdcj2ne6#

我在这里找到了以下内容和here,这对我很有帮助:

<web-app
  xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">

属性xmlns的值以j2ee结尾,而不是以javaee结尾。

相关问题