使用纯 JAX-WS 添加 SOAP 标头对象

2023-12-27

我正在尝试实现简单的网络服务客户端PayPal 快速结账 API using JAX WS. PayPal 快速结账 API提供WSDL文件,我可以使用该文件生成 Java 类CXF的wsdl2java公用事业。

从认证原因来看,需要添加SOAP 头对每个请求。这个标题非常简单,应该如下所示:

生成自WSDL课程包括ebay.apis.eblbasecomponents.CustomSecurityHeaderType代表我需要添加到每个请求中的标头的类。

所以问题是:如何添加手动创建的实例自定义安全标头类型考虑到以下条件,将类添加到 SOAP 请求的标头:

  1. 我不太渴望使用来自的课程com.sun.*此处答案中提到的软件包:JAX-WS - 添加 SOAP 标头 https://stackoverflow.com/questions/2322953/jax-ws-adding-soap-headers(主要是因为不同JDK之间可能存在可移植性问题)
  2. 我不想手动将该对象编组到nested javax.xml.soap.SOAPElement此处答案中提到的实例:如何使用 Java JAX-WS 添加 SOAP 标头 https://stackoverflow.com/questions/830691/how-do-i-add-a-soap-header-using-java-jax-ws

所以,看起来我在结合时找到了可能的答案JAX-WS & JAXB相关答案来自SO(如果有这些技术经验的人可以检查以下内容是否正确,我将不胜感激):

对我来说显而易见的事情是添加 SOAP 消息处理程序并更改 headerSOAP消息其中的实例:

import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.Handler;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.soap.SOAPHeader;
import ebay.api.paypalapi.ObjectFactory; // class generated by wsdl2java

// following class is generated by wsdl2java utility Service class
final PayPalAPIInterfaceService payPalService = new PayPalAPIInterfaceService();
final PayPalAPIAAInterface expressCheckoutPort = payPalService.getPayPalAPIAA();
final Binding binding = ((BindingProvider) expressCheckoutPort).getBinding();
List<Handler> handlersList = new ArrayList<Handler>();

// now, adding instance of Handler to handlersList which should do our job:
// creating header instance
final CustomSecurityHeaderType headerObj = new CustomSecurityHeaderType();
final UserIdPasswordType credentials = new UserIdPasswordType();
credentials.setUsername("username");
credentials.setPassword("password");
credentials.setSignature("signature");
headerObj.setCredentials(credentials);

// bookmark #1 - please read explanation after code
final ObjectFactory objectFactory = new ObjectFactory();
// creating JAXBElement from headerObj
final JAXBElement<CustomSecurityHeaderType> requesterCredentials = objectFactory.createRequesterCredentials(headerObj);

handlersList.add(new SOAPHandler<SOAPMessageContext>() {
    @Override
    public boolean handleMessage(final SOAPMessageContext context) {        
        try {
            // checking whether handled message is outbound one as per Martin Strauss answer
            final Boolean outbound = (Boolean) context.get("javax.xml.ws.handler.message.outbound");
            if (outbound != null && outbound) {
                // obtaining marshaller which should marshal instance to xml
                final Marshaller marshaller = JAXBContext.newInstance(CustomSecurityHeaderType.class).createMarshaller();
                // adding header because otherwise it's null
                final SOAPHeader soapHeader = context.getMessage().getSOAPPart().getEnvelope().addHeader();
                // marshalling instance (appending) to SOAP header's xml node
                marshaller.marshal(requesterCredentials, soapHeader);
            }
        } catch (final Exception e) {
            throw new RuntimeException(e);
        }
        return true;
    }

    // ... default implementations of other methods go here

});

// as per Jean-Bernard Pellerin's comment setting handlerChain list here, after all handlers were added to list
binding.setHandlerChain(handlersList);

的解释书签#1: 人们不应该封送标头对象本身,但是JAXB元素代表该对象,因为否则会出现异常。应该使用其中之一对象工厂生成的类WSDL用于创建所需的JAXB元素来自原始对象的实例。 (感谢@skaffman的回答:JAXB 没有生成 @XmlRootElement https://stackoverflow.com/questions/819720/no-xmlrootelement-generated-by-jaxb )

还应该参考Martin Straus扩展这个答案的答案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用纯 JAX-WS 添加 SOAP 标头对象 的相关文章

  • iPhone RESTful Web 服务

    然而 甚至不确定标题是否正确 我想做的是使用标准 NSURLConnection 类来处理调用我的 web 服务的响应 我使用 POST 方法更新数据库 使用 GET 方法从数据库检索行 我遇到的问题是这两个操作可能同时发生 因此处理请求的
  • SOAP Web 服务的命名空间是否区分大小写?

    我尝试部署一个 Web 服务 并将其更改为一台机器 当我测试其中一个 Web 方法时 我收到一条错误消息 服务器无法识别 HTTP 标头 Soapaction 的值 我做了一些搜索问题 当命名空间存在差异时 似乎有时会发生该错误 我查看了我
  • 用 C# 解析和查询 SOAP

    我正在尝试解析一个大量命名空间的 SOAP 消息 源也可以在here http tinyurl com n3av6k
  • 如何使用 Java 将文档上传到 SharePoint?

    我正在使用 Java 创建一些大文件 数据库导出 我需要将它们放在 SharePoint 服务器上的某个位置 现在 我正在使用 IE 执行此操作 但我也想自动化此步骤 我搜索了网络 发现了一些使用 SOAP 的提示 但我还没有真正了解这一切
  • WCF 数据服务实体框架

    我在 Stackoverflow 中遇到了这个问题 因为我遇到了同样的异常 升级到 EF 6 RTM 获取 System Data Entity Core Objects ObjectContext 不能用于返回类型 System Data
  • AxisFault:请求中缺少 wsse:安全标头

    我正在尝试使用 WSO2 应用程序服务器和身份服务器构建应用程序 基于 Axis2 Framework 的肥皂服务器需要具有基于 WS Trust 的身份验证 为了学习 我正在关注这个博客http www vitharana org 201
  • 在 ContainerResponseFilter 中获取响应 (JAX-RS 2)

    我正在尝试移植这个 CORS 过滤器 https raw github com ysangkok jax rs ng todo master topack WEB INF classes our package ResponseCorsFi
  • 一键提交多个表单

    我在用 SESSION为我的网上商店动态创建表单 这些表单包含客户想要的产品的自定义信息 这是布局 Page1 客户填写的表格如下所示
  • 将 PictureStream 转换为 HTML5 画布

    我正在从 net Web 服务检索图片流的字节数组 JSON 字节数组响应如下所示 137 80 78 372 617 more 我正在尝试转换这个字节数组并将其绘制到 HTML 画布中 如下所示 var context document
  • SharePoint SOAP GetListItems VS jQuery - 如何使用 Ajax 循环自定义列表项以及 Ajax 刷新列表内容?

    我使用 jQuery 通过 GetListItems 方法访问 Sharepoint 2007 的 SOAP 接口 以读取自定义的公告列表 以便让该列表每分钟刷新一次 以防列表的所有者添加新内容 以便新内容无需最终用户刷新其共享点屏幕即可可
  • 如何使用 Java 中的 Web 服务(例如 Axis2)发送复杂对象的数组或集合?

    我对 SOAP Web 服务还比较陌生 虽然我完成了一些较小的 Web 服务项目 但我偶然从来不需要返回 或用作参数 复杂 对象的数组或集合 当我尝试这样做时 根据我的 SOAP 绑定风格 我会得到不同的奇怪行为 当我使用RPC 文字 我可
  • REST Web 服务 WSDL? [复制]

    这个问题在这里已经有答案了 我正在实现一个 Web 服务 并且已经实现了 REST 和 SOAP 版本 看看哪个版本适合我的需求 我决定选择 REST 因为它很简单 而且我可能会开发一个 iPhone 应用程序来使用它 我的问题很简单 是否
  • JAX-WS Soap 错误未出现在 WSDL 中

    我正在使用 JAX WS 创建一个 Web 服务 我正在使用 Java 到 WSDL 方法创建它 我无法让我的例外按照我的要求工作 我创建了以下异常类 WebFault public class MyWebServiceException
  • 获取/发布到 RESTful Web 服务

    我需要从 VB6 对 RESTful Web 服务进行一些 GET 和 POST 操作 最好和最简单的方法是什么 您需要添加对 MSXML 库的引用 Dim sUrl As String Dim response As String Dim
  • 将 JSON 集合发送到 ASMX Web 服务

    我有这门课 public class DesignElements public List
  • 点击 Java Web 服务:curl 或 URLConnection

    我使用的 Java 服务器在以下 URL 上公开 RESTful API http localhost 8080 my server 文档建议使用curl用于提交简单的PUT请求 文件上传 并强烈建议用户使用与示例中提供的完全相同的参数 所
  • 如何在使用 Web 服务时获取会话对象?

    如何在使用 Web 服务时获取会话对象 服务在两个程序之间调用 如何在使用 Web 服务时获取用户会话对象 不可能使用请求对象获取会话 因为当我们谈论服务时不会有请求或响应 如果您正在与JAX WS https jax ws dev jav
  • 沙盒中的 PayPal Express Checkout 使交易处于“待处理”状态

    我已经使用以下方法集成了 PayPal Express Checkout https developer paypal com docs checkout integrate 1 set up your development enviro
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • 强制 WCF 在进入实际函数之前对每个请求调用一个方法

    我有一个具有许多不同功能的 RESTful WCF 服务 对于每个函数 我需要调用我编写的身份验证方法 我可以在每个请求上手动调用此方法 但我一直在寻找一种方法来强制 WCF 引擎在输入这些函数之前调用此方法 有谁知道这是否可能 Cheer

随机推荐