23

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

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

4

5 回答 5

40

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

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

应该:

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

于 2021-04-14T00:29:29.553 回答
22

日食 2021-06

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

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

错误答案

答案中的许多其他建议都是错误的,因为他们正在做的是将名称空间更改为不再映射到任何模式的东西,因此不再简单地检查事情。一些评论已经清楚地表明了这一点,所以在某些地方, javatoJavahttptohttpsjavaeetoj2ee真的只是隐藏了问题。

关键是,如果该消息出现,则确实存在需要查找和修复的验证问题。因此,虽然清理项目、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">

对比

<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:为元素“web-app”的身份约束“web-common-filter-name-uniqueness”声明的重复唯一值 [UrlRewriteFilter]。

这不会发生在 invalid/unknown/wrong/... 命名空间中,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 年编写时,这都不是问题。:-) 虽然部署描述符对我来说看起来仍然正确,但仅适用于某些旧版本,除了错误之外,肯定还有其他根本原因命名空间或类似名称。

于 2021-09-07T16:25:33.623 回答
6
<?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">

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

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

于 2021-05-12T12:30:02.630 回答
0

请在 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>
于 2021-10-01T07:30:57.993 回答
-4

我在这里这里找到了以下对我有帮助的内容:

<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结尾。j2eejavaee

于 2021-07-22T09:04:01.343 回答