java - 在 JAX-WS 客户端 .jar 中嵌入 Web 服务的 WSDL

标签 java jar wsdl jax-ws

我有一个几年前用 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/

相关文章:

java - 为什么没有导入facebook sdk

java - 将 InputStream 内包含的 json diff 结果分离到 Java 中的映射中

jar - Gradle:如何将资源(而非lib)jar添加到 war 根源?

java - 处理 WSDL 以仅包含特定功能

java - OCP 7 II 正则表达式

java - 可选的 monad 和 Java 中的 Demeter 法则

java - 使用适用于 Java 的 MQ 类运行简单 jar 时出错

java - Jetty ServletTester类打包在哪里?

java - 如何在 Java 中使用 SOAP 实现基于 HTTPS 的 Web 服务

web-services - 从网站到 Web 应用程序的 Web 服务消费