当前位置: 首页 > 知识库问答 >
问题:

如何从Camel中的交换对象检索SOAP头?

岑俊明
2023-03-14

> < li >我们公开了一个Apache camel-cxf webservice。使用camel处理器,我们试图从soapUi客户端获取我们在soap请求中传递的soap头。 < li>

交换对象包含soap消息的正文(不是soap消息头)。在exchange.getIn.getHeader()中,我们只获得传递的HTTP头,而不是SOAP头。

如何在Camel中从交换对象中检索SOAP头?

以下是传递的肥皂标头:

<soapenv:Header>
  <ns1:info xmlns:ns1="http://www.w3schools.com/transaction/">
    <ns1:TransactionID>01</ns1:TransactionID>
    <ns1:AppUserID>52</ns1:AppUserID>
    <ns1:AppPass>ab</ns1:AppPass>
  </ns1:info>
</soapenv:Header>

>

  • 我们尝试使用,

    >

  • exchange.get(). gethead ers();
  • exchange.get(). gethead er("TransactionID");

    然而,它无法提取发送的SOAP标头。

  • 共有2个答案

    叶鸿振
    2023-03-14

    这就是我的解决方案

        List<SoapHeader> soapHeaders = (List)exchange.getIn().getHeader("org.apache.cxf.headers.Header.list");
        Element header = ((Element)soapHeaders.get(0).getObject());
        String eventType = (String)header.getElementsByTagName("TransactionID").item(0).getTextContent();
        exchange.getIn().setHeader("TYPE_EVENT",eventType);
    
    颛孙正卿
    2023-03-14

    如果cxfendpoint配置为以数据格式工作。有效负载so:

     .process(exchange -> {
                    CxfPayload body = exchange.getIn().getBody(CxfPayload.class);
                    for (Object header : body.getHeaders()) {
                        SoapHeader soapHeader = (SoapHeader) header;
                        org.w3c.dom.Element element = (Element) soapHeader.getObject();
                        //parse elements
                    }
                });
    

    如果在原始模式下,只需读取输入流并使用xpath将数据解析为xml

    UPD:

    示例路线:

    CxfEndpoint endpoint = new CxfEndpoint();
        endpoint.setDataFormat(DataFormat.PAYLOAD);
        endpoint.setWsdlURL("etc/Proxy.wsdl");
        endpoint.setAddress("http://localhost:8089/wsservice/");
        getContext().getRegistry().bind("cxfend", endpoint);
        from("cxf:bean:cxfend")
                .process(exchange -> {
                    CxfPayload body = exchange.getIn().getBody(CxfPayload.class);
                    for (Object header : body.getHeaders()) {
                        SoapHeader soapHeader = (SoapHeader) header;
                        org.w3c.dom.Element element = (Element) soapHeader.getObject();
                        Element transactionID = (Element) element.getElementsByTagName("ns1:TransactionID").item(0);
                        log.info("Header TransactionID with value:{}", transactionID.getTextContent());
                    }
                });
    

    输出:

    2020-03-03 11:43:03,327 [main           ] INFO  Server                             
    - jetty-9.4.21.v20190926; built: 2019-09-26T16:41:09.154Z; git:     
    72970db61a2904371e1218a95a3bef5d79788c33; jvm 1.8.0_232-b18
    2020-03-03 11:43:03,377 [main           ] INFO  AbstractConnector              
    - Started ServerConnector@b016b4e{HTTP/1.1,[http/1.1]}{localhost:8089}
    2020-03-03 11:43:03,377 [main           ] INFO  Server                         
    - Started @3403ms
    2020-03-03 11:43:03,400 [main           ] INFO  ContextHandler                 
    - Started o.e.j.s.h.ContextHandler@1b15f922{/wsservice,null,AVAILABLE}
    2020-03-03 11:43:03,400 [main           ] INFO  DefaultCamelContext            
    - Route: route1 started and consuming from: cxf://bean:cxfend
    2020-03-03 11:43:03,406 [main           ] INFO  DefaultCamelContext            
    - Total 1 routes, of which 1 are started
    2020-03-03 11:43:03,408 [main           ] INFO  DefaultCamelContext            
    - Apache Camel 3.0.1 (CamelContext: camel-1) started in 1.953 seconds
    2020-03-03 11:43:10,068 [tp1299661385-22] INFO  TypeUtil                       
    - JVM Runtime does not support Modules
    2020-03-03 11:43:10,196 [tp1299661385-22] INFO  RouteTest                      
    - Header TransactionID with value:01
    
     类似资料:
    • 我正在进行我的第一个骆驼项目,如果这很明显或令人困惑,请道歉。 该应用程序是一个简单的服务,happy path是从一个文件夹中收集一个PDF,获取一个电子邮件地址以发送它,创建并发送电子邮件(使用Velocity模板,将PDF作为附件),记录电子邮件已发送,并删除文件。 但是我正在尝试构建一些重试逻辑,将文件移动到单独的文件夹中以便稍后重新加载。 我试图解决的问题是,Vel这时候组件用email

    • 问题内容: 所以,我有一个 基于Java的Web项目 ,从3个独立的服务检索到的信息显示,托管在不同的服务器上,我使用 的Apache HTTP客户端 来获取通过在REST API信息 JSON ,使用 GSON库 。我将Json转换为用于显示信息的POJO。 现在,我想在项目中实现搜索功能,因此我将Solr安装在单独的服务器上,我想要的是: 为所有3个服务在solr服务器中索引JSON。 从So

    • 我正在尝试从WordPress对象检索文章标题。 我应该做什么来检索标题?

    • 问题内容: 是否可以从框架对象中检索任何类信息?我知道如何获取文件(frame.f_code.co_filename),函数(frame.f_code.co_name)和行号(frame.f_lineno),但也希望能够获取活动对象的类的名称框架的实例(如果不在实例中,则为None)。 问题答案: 我不相信,在框架对象级别上,没有任何方法可以找到已被调用的实际python函数对象。 但是,如果您的

    • 问题内容: 我有要解析的JSON文件。JSON文件(“ myfile”)的格式如下: 我想从语言级别检索键2的值(ŚrednioZaawansowany)。 接下来做什么?我如何迭代呢? 问题答案: 也许您没有使用Java库的最新版本的JSON。 已有很长时间没有更新,而2个月前已更新。 可以在GitHub上找到,这是其仓库的链接:https : //github.com/douglascrock

    • 我正在尝试将我的实时数据库调整为一个聊天应用程序的云firestore。存储的对象是我创建的Message类。我希望邮件成为文档。 我的RecyclerView适配器将使用实时数据库这样检索它们: 下面是我如何开始用Firestore重新创建它的。如何在快照侦听器的OneEvent方法中将快照转换回消息?