JAX-WS 从 jar 加载 WSDL

2024-03-13

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

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

我已经添加了wsdllocationarg 到 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");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAX-WS 从 jar 加载 WSDL 的相关文章

  • java:在一个Web应用程序中使用同一库的两个版本

    我面临以下问题 我的 web 应用程序中有一个模块需要 jaxb 1 x 而另一个模块需要 jaxb 2 x 第一个模块不适用于新版本的 jaxb 反之亦然 如何在一个项目中使用这两个罐子 谢谢 对于常规应用程序 通常不同的版本使用不同的包
  • 将库包含在jar中

    好的 这就是我们得到的 我们有两个库包 我们已将它们编译成 jar package starwars public class JarJar public void JarSayHello System out println Jaaaaa
  • Netsuite - 如何为 getall 请求指定 record_type

    我想获取所有 InventoryItems 的列表 根据这份文件 https system netsuite com help helpcenter en US Output Help SuiteCloudCustomizationScri
  • 为什么 Logstash 需要这么长时间才能启动/加载?

    Edit 我更改了标题 因为问题不是我最初想象的那样 事实是 logstash 需要超过一分钟开始 这可能会被误解为 沉默 我正在尝试让logstash运行 所以我按照官方网站上的说明进行独立安装 http logstash net doc
  • NetBeans - 将所有内容部署在一个 jar 中[重复]

    这个问题在这里已经有答案了 可能的重复 将外部库放入 JAR 中 https stackoverflow com questions 2034180 put external library to the jar 我有 NetBeans 6
  • “找不到 jar 文件系统提供程序”尝试使用 jdeps 和 jlink 创建收缩 Java 映像来运行 Minecraft

    我正在尝试使用以下命令创建一个收缩 Java 映像来运行 Minecraft 1 20 1 客户端jdeps and jlink 即只需要运行 Minecraft 所需的最少 Java 模块 但是我遇到了错误 我希望得到一些指导 这就是我所
  • 发生异常时如何优雅地关闭Endpoint?

    我编写了一个小型 JAX WS Web 服务 它在容器外部运行Endpoint publish Endpoint endpoint Endpoint create new MyServiceImpl endpoint publish htt
  • 如何制作包含DLL文件的JAR文件?

    我购买了一个第三方Java库 其中包括一个JAR文件和两个DLL文件 我编写了自己的 Java 程序来调用第三方 JAR 文件 现在我的问题是如何将我的所有代码打包到一个 JAR 文件中 其中包含我的所有代码以及第三方 JAR 和 DLL
  • 无法引用 AppFabric 上托管的 WCF Web 服务的 WSDL

    我开发了一个 WCF 服务 并且在 Visual Studio 2010 中 我可以毫无问题地导入 WSDL 将其部署到 AppFabric 后 我获得了 WSDL 但由于某种原因无法找到 WSDL 内部引用的几个架构文件 不知道是配置问题
  • 从 kotlin 多平台项目创建 fat jar

    我最近从旧的 1 2 多平台切换到 1 3 不同之处在于 每个多平台模块都有一个 build gradle 文件 我有 5 个 因此配置少了很多 但是 我似乎无法配置使用 jvm 平台的所有依赖项创建可运行的 fat jar 我曾经在 jv
  • 具有重复名称的 WSDL — 如何强制 Java 类名称

    背景 我们正在开发一个与多个第三方网络服务通信的应用程序 遗憾的是 其中一个使用糟糕的命名约定定义了 WSDL 文件 响应元素及其使用的复杂类型经常重复使用相同的名称 下面的代码片段显示了这样一个例子
  • 如何将Matlab代码库与Android集成?

    我有一个算法和 MATLAB 中的一些其他代码 我想在我的 Android 应用程序中使用它 我怎样才能做到这一点 我可以从 MATLAB 制作 jar 文件以便与 Android 一起使用吗 我必须做点别的事吗 如果您还有其他产品 适用于
  • 将 JAR 文件打包为 WAR 文件

    我有一系列依赖的Java项目 我想将它们打包成一个 JAR 文件 以便在我的 WAR 文件中使用 这些项目依赖于大量的外部库和项目 如log4j apache commons等 我选择 Eclipse 中的所有项目并导出为 JAR 文件 然
  • 运行 JAR 时“JCE 无法验证提供者 BC”

    在我的 scala 项目中我使用 org bouncycastle bcprov jdk14 1 51 用于密码学 如果它在 Scala IDE 中测试我的项目 它工作得很好 但是一旦我制作了一个 JAR 并尝试通过以下方式运行它java
  • WCF 回调:它可以与 Java 互操作吗?

    目前 我以 正常 方式实现所有 Web 服务 也就是说 我在 Eclipse 中创建一个 WSDL 文件 然后使用 WSCF blue 一个 Visual Studio 扩展 自动生成必要的代码 它是回复 请求 不过 我希望改用回调 这样我
  • 使用从 java 程序调用的 Windows 命令提示符将具有多个连续空格的字符串作为参数传递给 jar 文件

    我想使用在另一个java程序中调用的Windows命令提示符将带有多个连续空格的字符串作为参数传递给jar文件 java 文件是这样的 它打印它的所有参数 package src public class myClass public st
  • 在资源中找到未签名的条目....jar

    我正在使用 Netbeans 来编译和签署我的所有 jar 所有这些都使用相同的证书 但是 当我使用 Sun Java SE 6 运行 Webstart 时 出现错误 Found unsigned entry in resource jar
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • JAX-RS 和 JAX-WS 有什么区别?

    阅读了几篇有关 JAX RS 和 JAX WS 的文章后 我有几个问题想确认一下 JAX RS可以像JAX WS一样做异步请求吗 JAX RS 能否访问不在 Java 平台上运行的 Web 服务 反之亦然 REST 对于配置文件有限的设备

随机推荐