【问题标题】:How to retrieve the SOAP header from exchange object in Camel?如何从 Camel 中的交换对象中检索 SOAP 标头?
【发布时间】:2019-01-24 08:52:07
【问题描述】:
  • 我们公开了一个 Apache camel-cxf Web 服务。使用骆驼处理器,我们试图从soapUi客户端获取我们在soap请求中传递的soap标头。
  • 交换对象包含soap消息的主体(不是soap头)。在 exchange.getIn.getHeader() 中,我们只获取我们传递的 HTTP 标头,而不是 SOAP 标头。

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

  • 以下是通过的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.getIn().getHeaders();
    • exchange.getIn().getHeader(“TransactionID”);

      但是它无法提取发送的 SOAP 标头。

  • 如何在 Payload 模式下添加自定义的 soap 头?

【问题讨论】:

    标签: java soap apache-camel cxf spring-camel


    【解决方案1】:

    如果 cxf 端点配置为在 DataFormat.PAYLOAD 中工作,那么:

     .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

    更新:

    示例路线:

    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
    

    【讨论】:

    • 你不应该像“它不工作”这样回答。使用堆栈跟踪发布异常或描述丢失/意外的行为,有用的东西。
    【解决方案2】:

    这是我的解决方案:

        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);
    

    【讨论】:

    • 我只是问,因为我正在寻找解决方案 ;) 而你的解决方案效果不佳!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    相关资源
    最近更新 更多