gpt4 book ai didi

wsdl - JAX-WS 从 jar 加载 WSDL

转载 作者:行者123 更新时间:2023-12-02 05:11:10 27 4
gpt4 key购买 nike

我正在编写一个胖客户端,它使用 SOAP 服务来实现某些功能(错误报告等)

我的 JAX-WS 工作正常,但默认情况下(至少在 netbeans 中)它会在每次初始化服务时从远程服务器获取 WSDL。我希望这有助于提供一些版本控制支持等,但这不是我想要的。

我已将 wsdllocation 参数添加到 wsimport,以将生成的类指向本地资源。以下代码片段是从 ApplicationService.java 加载 WSDL 资源的 URL。

baseUrl = net.example.ApplicationService.class.getResource(".");
url = new URL(baseUrl, "service.wsdl");

我很确定指向存储在 net/example/resources 包中的 jar 内的资源应该没有问题,并且 jar 本身是按预期构建的。但是,该服务不会加载...具体来说,当我调用 ApplicationService.getPort(); 时,我收到 NullPointerException;

这可能吗?还是只是徒劳无功?

最佳答案

是的,这绝对是可能的,因为我在通过 javax.xml.ws.EndpointReference(一个 WS-A 相关类)创建客户端时已经这样做了。我已将 WSDL 的类路径引用添加到 WS-A EndPointReference,并且 JAX-WS 的 Metro 实现加载了它。无论是从 WS-A EndPointReference 还是从文件或 http URL 加载 WSDL,您的 JAX-WS 实现都应该使用相同的 WSDL 解析代码,因为您所做的只是解析 URL。

最适合您的方法可能是执行以下操作:

URL wsdlUrl = MyClass.class.getResource(
"/class/path/to/wsdl/yourWSDL.wsdl");

Service yourService= Service.create(
wsdlUrl,
...);

其中 ... 表示 WSDL 内 WSDL 服务的 QName。现在要记住的重要一点是您的 WSDL 需要完整且有效。这意味着,如果您的 WSDL 导入 XSD 文件或其他 WSDL,则 URL 必须正确。如果您将导入的 WSDL 和 XSD 包含在与 WSDL 文件相同的 JAR 中,则应该使用相对 URL 进行导入,并将所有导入保留在同一个 JAR 文件中。 JAR URL 处理程序不会将相对 URL 视为相对于类路径,而是相对于 JAR 文件内的相对 URL,因此您不能在跨 JAR 运行的 WSDL 中进行导入,除非您实现自定义 URL 处理程序和您自己的前缀基于类路径的导入解析。如果您的 WSDL 导入外部资源,那没问题,但如果这些资源发生移动,您就会面临维护问题。即使使用类路径中 WSDL 的静态副本也违背了 WSDL、Web 服务和 JAX-WS 的精神,但有时这是必要的。

最后,如果您嵌入静态 WSDL,我建议您至少使服务端点可配置以用于测试和部署目的。重新配置 Web 服务客户端端点的代码如下:

  YourClientInterface client = yourService.getPort(
new QName("...", "..."),
YourClientInterface.class);
BindingProvider bp = (BindingProvider) client;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:8080/yourServiceEndpoint");

关于wsdl - JAX-WS 从 jar 加载 WSDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/764772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com