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

时间:2011-05-09 17:14:59

标签: java jar wsdl jax-ws

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

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

我还希望让客户端做类似解决方案jgrowl找到的东西,这似乎有效,但不是Just Work。在Google上找到的文章主要针对服务器WSDL位置,但建议客户端应该能够使用META-INF/jax-ws-catalog.xml文件将-wsdllocation中使用的URL转换为.jar文件中的路径,但这些文件不会似乎在我们的测试中有效。

是否有一个“配方”,以便我可以将WSDL放在.jar的某个地方并让JAX-WS客户端正常工作而客户端用户无需付出额外的努力没有警告?

1 个答案:

答案 0 :(得分:3)

如果您不想在构造函数中将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发挥作用的地方。