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

Aus*_*ler 5 java wsdl jar jax-ws

我有一个几年前在C++中创建的Web服务,并由.NET客户端使用C#的"wsdl.exe"来生成客户端存根.出于各种原因,我现在还需要Java客户端,并且愿意使用JAX-WS限制Java 6(JDK 1.6)的使用.生成的存根工作正常,即使打包在.jar中,但我遇到了JAX-WS Web服务客户端要部署的方式的问题.看起来我遇到的问题可以解决的,但建议的方法似乎都不起作用.

JAX-WS期望WSDL可以访问,最好是从网络访问,因为它每次启动时都会解析WSDL以创建绑定.与使用已知但无法访问的wsdl创建Web服务客户端中的 jgrowl一样,客户端可能无法访问JAX-WS使用的URL(可能是构建计算机上的文件或指向localhost的指针)的WSDL. .我想在客户端.jar中发布WSDL,但最简单的解决方案(-wsdllocation "/path/to/wsdl/in/jar.wsdl")打印出一个我不想显示的警告.

我也宁愿具有客户做这样的事情找到了解决办法jgrowl,这似乎工作,但不只是工作.在Google上找到的文章主要针对服务器WSDL位置,但建议客户端应该能够META-INF/jax-ws-catalog.xml使用将用于转换-wsdllocation为.jar文件中的路径的URL 的文件,但这些文件在我们的测试中似乎不起作用.

是否有一个"配方",以便我可以将WSDL放在.jar的某个地方并且让JAX-WS客户端需要在客户端用户方面不需要额外的工作而且没有警告?

McD*_*ell 3

如果您不想在构造函数中设置 WSDL 的 URL,您也许可以依赖生成的工件的行为。当我使用以下内容时-wsdlLocation

-wsdllocation wsdl/MaintainAddress.wsdl
Run Code Online (Sandbox Code Playgroud)

在服务代码中生成以下内容作为静态初始化程序:

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;
}
Run Code Online (Sandbox Code Playgroud)

这基本上会做与您找到的解决方案相同的事情,但使用默认构造函数。WSDL 必须是文件夹中类路径上的资源wsdl

这种方法不会对我发出任何警告。

我认为规范中没有定义这种行为- 至少,我还没有找到它。我相信这是我的 JDK 中该工具的实现细节wsimport


如果您要部署到 Java EE 容器,您有更多选择 - 请参阅JSR 109。我相信这就是jax-ws-catalog.xml发挥作用的地方。