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

Posted

技术标签:

【中文标题】web.xml 中的 cvc-id.3 错误【英文标题】:cvc-id.3 error in web.xml 【发布时间】:2011-03-14 06:36:07 【问题描述】:

我在 Eclipse 中为 SpringMVC web-app 编辑 web.xml 文件时收到此错误消息:

cvc-id.3:身份字段 约束 'web-app-servlet-name-uniqueness' 匹配元素“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>

&lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt; 声明中的错误点。 我应该怎么做才能解决它? 提前谢谢你。

【问题讨论】:

该错误表明servlet-name 的唯一性存在问题。我们可以看到整个文件,而不仅仅是那一点吗? 【参考方案1】:

无意中发现把Java改成大写,错误就消失了:

xmlns="http://java.sun.com/xml/ns/javaee"

应该是:

xmlns="http://JAVA.sun.com/xml/ns/javaee"

【讨论】:

今天遇到了同样的错误。实际上,您可以只输入“Java”而不是“java”,它可以工作......我选择在 https 中添加一个“s”......它也解决了错误。这是一些奇怪的东西...... 通过使用不同的外壳,您在技术上引入了不同的命名空间。所以,这并不是真正的解决方案。 天哪,这不可能都是真的。 GWT 到底有多死?? 我确认将其更改为“JAVA”或“Java”可以修复它。此外,将网址切换为“https ...”而不是“http ...”而没有其他更改似乎也可以做到这一点。只需执行 [Project > Clean] 并不会修复它。 这不是一个答案,人们只是通过将命名空间更改为 Eclipse 未知和忽略的名称来隐藏潜在问题。这些建议与使用 xmlns="foobar" liquid-technologies.com/xml-schema-tutorial/xsd-namespaces 的效果相同【参考方案2】:

Eclipse 2021-06

我今天遇到了与 Eclipse 2021-06 类似的问题:

cvc-id.3:身份约束“web-common-filter-name-uniqueness”匹配元素“web-app”的字段,但该元素没有简单类型。

错误答案

答案中的许多其他建议都是错误的,因为他们正在做的是将命名空间更改为不再映射到任何架构的东西,因此不再简单地检查事情。一些 cmets 已经明确了这一点,所以 javaJavahttphttpsjavaeej2ee 在某些地方确实只是隐藏了问题。

关键是,如果该消息出现,则确实存在需要查找和修复的验证问题。因此,虽然清理项目、Windows/Preferences/Network Connections/Cache 等下的 Eclipse 网络缓存等建议是常见的 Voodoo,但它们可能(!)工作!不过,这不是我的问题。

部署描述符 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-constraint.4.1:重复唯一值 [UrlRewriteFilter] 为身份约束“web-common-filter-name-uniqueness”声明 元素“网络应用”。

无效/未知/错误/...命名空间不会发生这种情况,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 年编写时,这都不是问题。:-) 虽然部署描述符对我来说仍然正确,但仅适用于某些旧版本,肯定还有其他根本原因,因为好过错误的命名空间或类似的东西。

【讨论】:

请为这个答案投票 :) 对我来说,将其更改为 3.1 并不能解决错误,但将其更改为 2.5 可以。 所以你实际上使用了问题的定义?因为更改版本号只会再次隐藏底层问题。 对我来说下一个明显的问题是,是否有某个地方提交了 Eclipse 错误?...这真的很烦人,我还不能更改为 3.1,因为我们当前支持的级别服务器。 我打开了bugs.eclipse.org/bugs/show_bug.cgi?id=577715【参考方案3】:
<?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" 可能会解决您的问题。

两个定义文件中都有元素,所以如果没有适当的命名空间,它们就不会是唯一的

【讨论】:

使用xmlns:javaee而不使用&lt;javaee:servlet&gt;也只会隐藏问题,就像所有其他答案建议javaJAVAhttphttps一样。不是吗?【参考方案4】:

请在 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>

【讨论】:

【参考方案5】:

我发现以下 here 和 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

【讨论】:

不要关注使用ISO-8859-1 获取 XML 示例的人。 :-) j2ee 与架构位置 javaee 结合起来没有多大意义。 schemaLocation 将命名空间映射到文件,javaee 被导入/使用。 OTOH,schemaLocation 中没有提到j2ee,因此解析器根本不会验证。这就是错误消失的原因。 ***.com/a/5875404/2055163

以上是关于web.xml 中的 cvc-id.3 错误的主要内容,如果未能解决你的问题,请参考以下文章

cvc-id.3: A field of identity constraint ‘web-app-servlet-name-uniqueness‘ matched element ‘web-app‘

web.xml文件中的7个错误的安全配置

Eclipse Java 动态 Web 项目的 Web.xml 中的错误 [创建新项目时]

处理应用程序 web.xml 中的错误 503?

Spring 中的 404 错误(java config / no web.xml)

Web.xml 中的 java.lang.Throwable 错误页面中显示的 ViewExpiredException