Eclipse 2021-06
今天我遇到了与Eclipse 2021-06类似的问题:
cvc-id.3:身份约束'web-common-filter-name-uniqueness'的字段匹配元素'web-app',但此元素没有简单类型。
错误答案
其他答案中很多建议都是错误的,因为它们所做的事情是将命名空间更改为不再映射到任何模式而且因此不能简单地进行检查。一些评论已经表明了这一点,因此在某些地方将java
更改为Java
或http
更改为https
或javaee
更改为j2ee
只会隐藏问题。
关键是,如果出现该消息,则确实存在需要找到并修复的验证问题。因此,像清除项目、在Windows / Preferences / Network Connections / Cache下清除Eclipse的网络缓存等建议通常都是巫术,它们可能(!)起作用!但是,在我的情况下问题并不在那里。
部署描述符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]。
这种情况在出现无效/未知/错误/ ... 命名空间时不会发生,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文件映射到多个不同的URI名称下。因此,理论上旧的URI仍然可用并被使用,但由于某些原因似乎并没有。另一方面,新的URI出于某种原因似乎可行,但在这些情况下需要保留旧的命名空间!原因很简单,就是无论使用哪个URI来读取它,唯一可用的文件仍包含旧的命名空间。
![Eclipse WWD catalog settings](https://istack.dev59.com/XK7IM.webp)
<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标签库中似乎有效一样。同样也没有让任何更新的东西工作,看起来标准已经有所改变,并且我需要采用更多的方法,这是我不想要的遗留问题... :-)
servlet-name
的唯一性存在问题。我们能否查看整个文件,而不仅仅是那个部分? - skaffman