日食 2021-06
我今天遇到了与 Eclipse 2021-06 类似的问题:
cvc-id.3:身份约束“web-common-filter-name-uniqueness”匹配元素“web-app”的字段,但该元素没有简单类型。
错误答案
答案中的许多其他建议都是错误的,因为他们正在做的是将名称空间更改为不再映射到任何模式的东西,因此不再简单地检查事情。一些评论已经清楚地表明了这一点,所以在某些地方, java
toJava
或http
tohttps
或javaee
toj2ee
真的只是隐藏了问题。
关键是,如果该消息出现,则确实存在需要查找和修复的验证问题。因此,虽然清理项目、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_*.xsd
到web-app_*.xsd
自身。否则真的只有很小的变化。
结论
整个有趣的问题是为什么 Eclipse 停止为前者工作,web.xml
即使它看起来是完全正确的。只有命名空间和版本号发生了变化,但在过去几年里一直有效。我不确定的是,旧 Eclipse 是否使用语言服务器进行了验证,就像当前使用的版本一样。我想知道语言服务器提供的任何东西是否可能已更改,并且部署描述符的 3.0 版可能根本不再受支持。
或者关于下载和包含的其他内容发生了变化,web-common_*.xsd
这就是他们需要将类型重构到父文件中的原因。
当然,当问题实际上是在 2010 年编写时,这都不是问题。:-) 虽然部署描述符对我来说看起来仍然正确,但仅适用于某些旧版本,除了错误之外,肯定还有其他根本原因命名空间或类似名称。