如何从请求中读取 SOAP 标头信息并将其添加到 Spring Web 服务中的响应中

2023-11-21

我正在研究 Spring Web 服务。我需要在请求和响应消息中添加一些自定义元素。它应该如下所示:

<soapenv:Envelope>
   <soapenv:Header>
      <tid:SplsTID>
         <tid:Trantype>123</tid:Trantype>
         <tid:Tranver>234</tid:Tranver>
      </tid:SplsTID>
   </soapenv:Header>
   <soapenv:Body>
      <get:GetOrderNumberRequest LoggingLevel="REGULAR" MonitorFlag="Y">
         <get:Header>
            <get:TransactionId>111</get:TransactionId>
            <get:SourceSystemId>SOMS</get:SourceSystemId>
            <get:DateTime>2011-11-11T11:11:11</get:DateTime>
         </get:Header>
         <get:Body>
            <get:StaplesOrderNumber RangeFlag="N" ReleaseFlag="N">
               <get:OrderNumber Count="1" End="11" Start="9"/>
            </get:StaplesOrderNumber>
         </get:Body>
      </get:GetOrderNumberRequest>
   </soapenv:Body>
</soapenv:Envelope>

我可以追加<tid:SplsTID> under <soapenv:Header>通过修改 WSDL 文件来请求。看起来像这样:

<wsdl:message name="GetOrderNumberRequest">
        <wsdl:part element="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
        </wsdl:part>
        <wsdl:part element="sch1:SplsTID" name="SplsTID">
        </wsdl:part>
    </wsdl:message>
    <wsdl:message name="GetOrderNumberResponse">
        <wsdl:part element="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
        </wsdl:part>
        <wsdl:part element="sch1:SplsTID" name="SplsTID">
        </wsdl:part>
    </wsdl:message>
    <wsdl:portType name="ONAS">
        <wsdl:operation name="GetOrderNumber">
            <wsdl:input message="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
            </wsdl:input>
            <wsdl:output message="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
            </wsdl:output>
        </wsdl:operation>
    </wsdl:portType>

问题是我想读书<tid:SplsTID>请求的一部分,并希望将其附加到响应的肥皂头部分下,但这没有发生。我正在使用基于注释的端点。将读取肥皂头并将其附加到响应中的代码是什么。

目前我的终点课程是:

@Endpoint
public class OrderNumberServiceEndPoint {
    public static final String NAMESPACE_URI = "http://schemas.staples.com/onas/getOrderNumber";

    /**
     * The local name of the expected request.
     */
    public static final String REQUEST_LOCAL_NAME = "GetOrderNumberRequest";

    /**
     * The local name of the created response.
     */
    public static final String RESPONSE_LOCAL_NAME = "GetOrderNumberResponse";

    private GetOrderNumberService getOrderNumberService;

    public void setGetOrderNumberService(
            GetOrderNumberService getOrderNumberService) {
        this.getOrderNumberService = getOrderNumberService;
    }

    @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI)
    public GetOrderNumberResponse processOrderNumberRequest(
            GetOrderNumberRequest request) throws Exception {
        GetOrderNumberResponse response = null;
        try{
        response = getOrderNumberService.executeRequest(request);
        }catch(CannotCreateTransactionException e){
            logger.error(ErrorConstants.ERROR_E17);
            throw new ServiceException(ErrorConstants.ERROR_E17);
        }
        return response;
    }

}

如果需要更多详细信息,请告诉我。任何帮助,将不胜感激。


最后我成功地从请求中读取肥皂头并将其附加到响应中。这就是我的终点方法现在的样子:

 @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI)
    @ResponsePayload
    public GetOrderNumberResponse processOrderNumberRequest(
            @RequestPayload GetOrderNumberRequest request,
            MessageContext messageContext) throws Exception {
        logger.info("Request Received");
        // read SOAP Header from request and append in response
        SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext
                .getRequest();
        SoapHeader reqheader = soapRequest.getSoapHeader();
        SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext
                .getResponse();
        SoapHeader respheader = soapResponse.getSoapHeader();
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements();
        while (itr.hasNext()) {
            SoapHeaderElement ele = itr.next();
            transformer.transform(ele.getSource(), respheader.getResult());
        }
        // process the request PayLoad
        GetOrderNumberResponse response = null;
        try {
            response = getOrderNumberService.executeRequest(request);
        } catch (CannotCreateTransactionException e) {
            logger.error(ErrorConstants.ERROR_E17);
            throw new ServiceException(ErrorConstants.ERROR_E17);
        }
        logger.info("Response Sent");
        return response;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从请求中读取 SOAP 标头信息并将其添加到 Spring Web 服务中的响应中 的相关文章

  • Spring - 如何调整 SoapEnvelopeLoggingInterceptor 比标准输出更正式地记录数据到日志文件

    我正在尝试对我的 Spring Web 服务请求 响应进行正式审核 我在 Spring 配置中设置了这个
  • 如何跟踪我的 Web 服务抛出的 IIS 500 错误

    我已经部署了新版本的 ASP NET Web 服务 当客户端调用此服务时 IIS 日志文件报告错误代码 500 我自己 测试 可以使用该服务 没有任何错误 我在 ASP NET Web 服务中启用了错误日志记录 但没有记录任何错误 这使我相
  • WCF vs ASPX webmethods vs ASMX webmethods

    目的是创建一组人们可以重用的 Web 服务 这些服务主要与创建 检索和处理数据的后端数据库交互 我们希望公开服务 以便人们可以用来创建数据混搭和其他应用程序 最终用户是可以位于我们域内或域外的网页 对于域外的页面 我们计划发布配置为检索和显
  • Axis2 不返回自己的对象

    我编写了一些网络服务 其中一些返回一个简单的字符串 这个可以工作 另一些返回一个对象列表 不 axis2 1 5 1 无法处理集合类型 所以我将返回类型更改为Object 但我仍然收到这个异常 ERROR java lang Runtime
  • 如何在 spring-ws 中解析 SoapFaultClientException

    我正在使用 spring ws 2 3 1 在为 Web 服务创建客户端时 有时我得到SoapFaultClientException像下面这样
  • 请求失败,HTTP 状态 401:未经授权

    我有一个在 IIS6 XP Pro SP2 中运行的 NET 2 0 网站 VB 和托管 ASMX Web 服务的 NET 3 5 当然 在 IIS 的 ASP NET 选项卡下配置为 NET2 在 Chrome 中 我可以成功调用 ASM
  • 如何使用 Java 将文档上传到 SharePoint?

    我正在使用 Java 创建一些大文件 数据库导出 我需要将它们放在 SharePoint 服务器上的某个位置 现在 我正在使用 IE 执行此操作 但我也想自动化此步骤 我搜索了网络 发现了一些使用 SOAP 的提示 但我还没有真正了解这一切
  • TSQL 返回 NO 或 YES,而不是 TRUE 或 FALSE

    如果某些列返回 FALSE 如何显示不同的值 例如 COLUMN BASIC 返回 FALSE 但我需要向用户显示 YES 或 NO 情况为 FALSE 返回 NO 如果是 varchar 或 bit 则处理 NULL case when
  • Web 服务客户端的 AXIS 与 JAX-WS

    我决定用Java 实现Web 服务客户端 我已经在 Eclipse 中生成了 Axis 客户端 并使用 wsimport 生成了 JAS WS 客户端 两种解决方案都有效 现在我必须选择一种来继续 在选择其中之一之前我应该 考虑什么 JAX
  • 为什么静态方法不能用作 ASMX Web 服务中的 Web 服务操作?

    我只是想了解为什么我不能在 Web 服务中使用静态 Web 方法 为什么会受到限制 有人可以给我对此进行简洁的解释吗 答案是 因为你不能 它不是这样设计的 其设计是 将创建 Web 服务类的实例 然后调用实例方法 我只能猜测微软为什么这样设
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 但说真的...... ASP.NET WebAPI 实现示例(包括 OAuth)

    我真的对 WCF 示例不感兴趣 我发现的 DotNetOpenAuth 实现也是不完整的 https github com DavidChristiansen DotNetOpenAuth WebAPI 40 or 假设WCF https
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • Web 服务与 Spring 远程处理

    我完全不明白通过 spring 或 axis 实现的常规 Web 服务与远程处理之间的区别 如果我的问题根本不相关 我只是对 Spring Web 服务与 Spring 远程处理感到困惑 何时使用远程处理以及何时使用 Web 服务 感谢您的
  • 将 JSON 集合发送到 ASMX Web 服务

    我有这门课 public class DesignElements public List
  • 无法找到请求的工厂 com.ctc.wstx.stax.WstxInputFactory

    我正在构建 Oracle Agile PLM CustomAction Px 我在Px内部调用了一个web服务来处理一些数据 我部署后 它给出了 类未找到异常 javax xml ws Service 所以我复制了jaxws api 2 1
  • 如何从 SOAP 响应中删除额外的结果标签

    我知道这个问题以前曾被问过 但我在任何地方都找不到答案 问题是我的 asmx 文件中有以下代码 namespace IrancellSmsServer SoapDocumentService RoutingStyle SoapService
  • JavaScript 并行性

    好吧 首先我想说我在互联网开发领域还是个新手 无论如何 我想知道是否可以使用 javascript 并行运行两段代码 我真正需要的是调用远程服务器中的两个方法 我为两者传递了一个回调函数 该函数将在我想要的数据准备好后立即执行 由于运行这些
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • 使用 New-WebServiceProxy 在 PowerShell 中添加自定义 SOAP 标头

    在 C 中我可以执行以下操作 var header MessageHeader CreateHeader MyHeader http mynamespace Header value OperationContext Current Out

随机推荐