在运行时,JAX-WS 会获取 SOAP 端点的 WSDL,即使它已经在 IDE 中运行了 wsimport。此处说明了此行为:http: //jax-ws.java.net/faq/index.html#wsdl_at_runtime
客户端在运行时可以检索的元数据数量是否有限制?如果是这样,有没有办法增加这个限制?
请注意,我不是指在 IDE 中运行 wsimport。效果很好。我专门讨论的是在运行时获取 WSDL 元数据。
在运行时,JAX-WS 会获取 SOAP 端点的 WSDL,即使它已经在 IDE 中运行了 wsimport。此处说明了此行为:http: //jax-ws.java.net/faq/index.html#wsdl_at_runtime
客户端在运行时可以检索的元数据数量是否有限制?如果是这样,有没有办法增加这个限制?
请注意,我不是指在 IDE 中运行 wsimport。效果很好。我专门讨论的是在运行时获取 WSDL 元数据。
在这个问题上花了很多时间后,我们想出了一个解决方案。我在 Netbeans 的 Metro 的 Glassfish 环境中工作。如果我们将 WEB-INF 复制到源包文件夹中,一切正常。java 运行时现在可以绑定到 jaxws-catalog.xml 文件中的相对路径。如果不复制该文件夹,它将无法工作。
Metro/JAX-WS-ri 在运行时需要 WSDL。有关说明,请参见http://jax-ws.java.net/faq/index.html#wsdl_at_runtime。
为了防止在运行时获取 WSDL,您应该将其打包为资源并在实例化代理工厂时提供它:
new XYZ_Service( XYZ_Service.class.getResource( "/path/to/your/XYZ.wsdl" ), new QName( "NameSpace", "ServiceName" ) );
基于您参考 Metro FAQ 的事实,您显然已经了解了为什么在运行时仍需要 WSDL 副本的原因。重申一下常见问题解答,原因是能够支持没有相应 Java 注释的 WS-* 扩展。
Metro 目前不可能禁用对扩展的支持,因此无法绕过运行时对 WSDL 的需求。