日食 2021-06
我今天在Eclipse 2021-06上遇到了类似的问题:
cvc-id.3:标识约束字段“web-common-filter-name-uniqueness”匹配元素“web-app”,但此元素没有简单类型。
错误的答案
答案中的许多其他建议都是错误的,因为他们正在做的是将命名空间更改为不再映射到任何架构的东西,因此不再简单地检查事物。一些评论已经清楚地表明了这一点,所以在某些地方,去或去或去实际上只是掩盖了问题。java
Java
http
https
javaee
j2ee
关键是,如果该消息出现,确实存在需要查找和修复的验证问题。因此,虽然清理项目,Eclipse的网络缓存等建议通常是巫毒教,但它们可能会(!)工作!不过,在我的情况下,这不是问题所在。Windows/Preferences/Network Connections/Cache
部署描述符 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及其8.0。对于很多用户来说,这应该足够老了。当然,Eclipse似乎也捆绑了该版本很长一段时间,否则它现在将无法验证。只需看一下文件。web.xml
org.eclipse.jst.standard.schemas_1.2.400.v202101070609.jar
3.0 至 3.1 的更改
我已经比较了这两个版本,似乎人们大多只更改了命名空间,并将一些类型从关联的名称迁移到自身。真的只有微小的变化。web-common_*.xsd
web-app_*.xsd
结论
总体上有趣的问题是,为什么Eclipse停止为前者工作,即使它似乎是完全正确的。只有命名空间和版本号发生了变化,但这在过去工作了很多年。我不再确定的是,旧的Eclipse是否使用语言服务器进行验证,就像当前使用的版本一样。我想知道语言服务器提供的任何内容是否可能已经更改,并且部署描述符的3.0版本可能不再受支持。web.xml
或者关于下载和包含的其他更改,这就是为什么他们需要将类型重构到父文件中的原因。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 包含一些目录文件,这些文件在多个不同的 URI 名称下映射相同的实际 XSD 文件。因此,虽然从理论上讲,较旧的URI应该仍然可用和使用,但它似乎不是出于某种原因。OTOH,较新的URI似乎出于某种原因工作,但在这些情况下,有必要保留旧的命名空间!原因很简单,唯一可用的文件仍然包含旧的命名空间,无论使用哪个URI来读取它。
<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也可能起作用,就像它似乎适用于我的JSP taglibs一样。没有让任何更新的东西工作,似乎标准已经发生了一些变化,我需要采用更多,我不再想要了。传统的东西... :-)web.xml