我有一个几年前用 C++ 创建的 Web 服务,由使用 C# 的“wsdl.exe”生成客户端 stub 的 .NET 客户端使用。出于各种原因,我现在还需要一个 Java 客户端,并且愿意将使用限制为 Java 6 (JDK 1.6) 和 JAX-WS。生成的 stub 工作正常,即使打包在 .jar 中,但我对 JAX-WS Web 服务客户端想要部署的方式有疑问。看起来我遇到的问题是可以解决的,但是建议的方法似乎都不起作用。
JAX-WS 期望 WSDL 可以访问,最好是从网络访问,因为它每次在启动时解析 WSDL 以创建绑定(bind)。就像 Creating a web-service client with a known but inaccessible wsdl 中的 jgrowl ,客户端可能无法访问 JAX-WS 使用的 URL 上的 WSDL(这可能是构建机器上的文件或指向本地主机的指针)。我想在客户端 .jar 中发送 WSDL,但最简单的解决方案 (-wsdllocation "/path/to/wsdl/in/jar.wsdl"
) 打印出一条我不想要的警告出现。
我还希望不让客户做一些类似 jgrowl 找到的解决方案的事情,它似乎有效但不只是有效。在 Google 上找到的文章大多涉及服务器 WSDL 位置,但建议客户端应该能够使用 META-INF/jax-ws-catalog.xml
文件来翻译 -wsdllocation 中使用的 URL
到 .jar 文件中的路径,但这些在我们的测试中似乎不起作用。
是否有一个“秘诀”,以便我可以将 WSDL 放入 .jar 中的某处,并让 JAX-WS 客户端正常工作,客户端用户无需额外的努力,并且没有警告?
最佳答案
如果您不想在构造函数中将 URL 设置为 WSDL,您可以依赖生成的工件的行为。当I use以下 -wsdlLocation
:
-wsdllocation wsdl/MaintainAddress.wsdl
以下是在服务代码中生成的静态初始化程序:
static {
URL url = null;
try {
URL baseUrl;
baseUrl = demo.ws.service.MaintainAddress_Service.class.getResource(".");
url = new URL(baseUrl, "wsdl/MaintainAddress.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'wsdl/MaintainAddress.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
MAINTAINADDRESS_WSDL_LOCATION = url;
}
这基本上会做与您找到的解决方案相同的事情,但使用默认构造函数。 WSDL 需要是 wsdl
文件夹中类路径上的资源。
这种方法不会向我发出警告。
我认为 the spec 中没有定义此行为——至少,我没能找到它。我相信这是我的 JDK 中 wsimport
工具的实现细节。
如果要部署到 Java EE 容器,您有更多选择 - 请参阅 JSR 109 .我相信这是 jax-ws-catalog.xml
发挥作用的地方。
关于java - 在 JAX-WS 客户端 .jar 中嵌入 Web 服务的 WSDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5940229/