3

我正在使用 Apache CXF 2.7.6 wsdl2java,该工具似乎忽略或无法找到公共目录条目。特别是我的<xs:import>一个 XSD 文件中有以下内容:

<xs:import namespace="http://www.ivoa.net/xml/STC/STCcoords/v1.10"/>

使用目录文件条目无法正确解决上述问题:

<public publicId="http://www.ivoa.net/xml/STC/STCcoords/v1.10" uri="STCcoords-v1.10.xsd"/>

如果我<xs:import>通过添加schemaLocation属性来更改,即更改为:

<xs:import namespace="http://www.ivoa.net/xml/STC/STCcoords/v1.10" schemaLocation="http://www.ivoa.net/xml/STC/STCcoords/v1.10/>

它解析文件,但我的理解是这不应该是必要的,因为我不想编辑我提供的 XSD。

无论使用 OASIS XML 格式还是 TR9401 格式,行为都是相同的。

4

1 回答 1

4

我从Apache CXF用户邮件列表中得到的答复是 XML Schema 规范将这一点留给了实现,因此不被视为错误。

线程在这里(帖子日期为 2013 年 9 月 26 日,在第 2 页,我似乎无法直接提供指向该页面的链接)。相关结论在这里。我引用:

我对此的看法:

1) 根据架构规范,如果未指定 schemaLocation 提示,则取决于应用程序在需要时确定如何解决它。因此,我真的不认为这是一个“错误”。我们专门只使用提供的信息,并且是“编译单元”(又名:wsdl)的一部分。

2)就个人而言,我认为不提供 schemaLocation 非常愚蠢,并且强烈建议添加它。我唯一一次看到它没有指定是在导入也嵌入在同一个 wsdl 中的模式时(所以没有位置)。
每当我在规范中看到“由应用程序决定”之类的东西时,对我来说,这就是互操作性的噩梦。只需指定它。

3) 话虽如此,根本问题在于 XmlSchema 的 SchemaBuilder 类。如果没有 schemaLocation,它假定它是它正在处理的编译单元的一部分并继续。不尝试解决任何问题。如果你想追求一个补丁什么的,它会在 SchemaBuilder.java 的 680 左右。但即使改变这一点,也可能需要 CXF 方面的更多支持来预先填充它已经知道的命名空间,以避免它为他们进入互联网。不太确定。

因此,可以确认:

  • Oracle Java 7wsimport附带的默认工具确实使用目录来解析导入语句,即使没有schemaLocation属性。
  • Apache CXF 2.7.6wsdl2java工具使用目录来解析没有schemaLocation属性的导入语句
  • Apache CXF 社区并不认为这是一个错误。
于 2013-10-01T21:17:09.143 回答