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

Ars*_*cum 13 java eclipse web.xml servlets

我在 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>
Run Code Online (Sandbox Code Playgroud)

<servlet-name>dispatcher</servlet-name>声明中的错误点。我该怎么做才能解决它?先感谢您。

Tho*_*ing 54

日食 2021-06

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

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

错误答案

答案中的许多其他建议都是错误的,因为他们正在做的是将名称空间更改为根本不再映射到任何模式的东西,因此不再简单地检查事情。有些评论已经说得很清楚了,所以在某些地方,javaJavahttphttpsjavaeej2ee实际上只是隐藏了问题。

关键是,如果出现该消息,则确实存在需要找到并修复的验证问题。因此,虽然诸如清理项目、Eclipse 下的网络缓存Windows/Preferences/Network Connections/Cache等的建议是常见的 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">
Run Code Online (Sandbox Code Playgroud)

<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">
Run Code Online (Sandbox Code Playgroud)

之后验证错误立即消失。不过,重要的是,与许多其他答案中引入无效/未知/错误/...名称空间相比,Eclipse 确实可以验证!这可以通过真正添加相同的两次来轻松测试filter-name,这会导致以下错误:

cvc-identity-constraint.4.1:为元素“web-app”的身份约束“web-common-filter-name-uniqueness”声明的重复唯一值 [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_*.xsdweb-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">
Run Code Online (Sandbox Code Playgroud)

<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">
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

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

Eclipse WWD 目录设置

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.
Run Code Online (Sandbox Code Playgroud)

因此,仅更改 URI 可能web.xml也有效,就像它似乎适用于我的 JSP 标记库一样。也没有任何更新的东西可以工作,似乎标准已经发生了一些变化,我需要采用更多,但我不再想要了。遗留的东西...:-)

  • 请对这个答案投赞成票:) (8认同)

小智 25

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

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

应该:

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

  • 这不是一个答案,人们只是通过将命名空间更改为 Eclipse 不知道和忽略的内容来隐藏潜在的问题。这些建议与使用 `xmlns="foobar"` 具有相同的效果 https://www.liquid-technologies.com/xml-schema-tutorial/xsd-namespaces (14认同)
  • 今天遇到同样的错误。实际上,您可以只输入“Java”而不是“java”,它就可以了...我选择在 https 中添加一个“s”...它也解决了错误。这是一些奇怪的东西... (6认同)
  • 通过使用不同的大小写,您在技术上引入了不同的名称空间。所以,这并不是一个真正的解决方案。 (5认同)

小智 8

<?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">
Run Code Online (Sandbox Code Playgroud)

添加一个namespace到您的xmlns="http://java.sun.com/xml/ns/javaee"行(例如)xmlns:javaee="http://java.sun.com/xml/ns/javaee"可能会解决您的问题。

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