Web Services JAX-WS RI在运行时生成WSDL,默认情况下导入的schemaLocation属性中包含公共URL

oxalkeyp  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(135)

当使用JAX-WS RI来发布使用从预先确定的.wsdl.xsd文件生成的存根控件实现的SOAP端点时,它会自动为发布的端点生成相应的WSDL文件。例如,在http://localhost:8081/ep发布的端点在http://localhost:8081/ep?wsdl有其WSDL文件,其中包含其他方案文件的导入,这些方案文件反过来可以导入更多文件。
问题是.xsd文件中的一个此类导入是使用对公共URL的引用自动生成的,如下所示:

...
<xs:import namespace="http://www.w3.org/2005/08/addressing" 
           schemaLocation="http://www.w3.org/2006/03/addressing/ws-addr.xsd"/>
...

尝试在没有公共Internet连接的环境中解析此端点的WSDL时,这可能会成为一个问题。生成的存根控件包括ws-addr.xsd中的类,因此JAX-WS RI应该能够从这些存根控件生成并发布.xsd
如何强制生成所需的.xsd模式本身,就像其他命名空间模式一样?为什么首先要使用公共位置?

ibrsph3r

ibrsph3r1#

问题是其他一些依赖项覆盖了模式的默认设置。由于项目使用JAX-WS RI,因此它还包括jakarta.xml.ws-api的依赖项,其中包括javax.xml.ws.wsaddressing包中的package-info.java文件,该文件包含以下标题:

@javax.xml.bind.annotation.XmlSchema(namespace=W3CEndpointReference.NS,
                                     location="http://www.w3.org/2006/03/addressing/ws-addr.xsd")
package javax.xml.ws.wsaddressing;

其中W3CEndpointReference.NShttp://www.w3.org/2005/08/addressing
这通过一些自动配置魔法,告诉JAX-WS RI在引用指定的名称空间时使用给定的公共位置。位置的默认值是##generate,它使模式生成器生成所需的组件。
因此,为了覆盖这个,我们可以将我们自己的package-info.java文件添加到我们自己的代码库中,但在同一个包中,使用相同的注解,但使用位置的默认值:

@javax.xml.bind.annotation.XmlSchema(namespace=W3CEndpointReference.NS)
package javax.xml.ws.wsaddressing;

(no location键表示使用默认值)
结果是生成的模式使用生成的寻址.xsd文件而不是公共文件:

<xs:import namespace="http://www.w3.org/2005/08/addressing"
           schemaLocation="http://localhost:8081/ep?xsd=10"/>

相关问题