2015-05-27 22 views
0

我目前正在Apache Apache CXF與Apache Camel集成的項目中工作。 Apache CXF是一個解決方案,我們用它公開一個WebService,然後編組/解組SOAP請求並將它傳遞給Camel。這是非常標準的。默認情況下,使用ApacheCXF中的POJO dataFormat,但是需要從SOAP頭獲取一些信息並將它傳遞給Camel。我的問題是如何做到這一點?當我在Apache CXF中使用Interceptor時,我可以獲得我需要的信息,但是我無法將它傳遞給Camel。下面的類是CXF攔截如何將參數從Apache CXF傳遞到Camel

public class MyInterceptor extends AbstractSoapInterceptor { 
    //..... some variables 

    @Override 
    public void handleMessage(SoapMessage message) throws Fault { 
     //..some logic and then setting a variable 

     message.getExchange().put("Foo", "Bar"); 
    } 
} 

...及以下類是駱駝的處理器,最終被稱爲:

public class MyCamelProcessor implements Processor { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     //how can I read information from CXF Intercptor here? 
     //how can I read "Foo" value?   
    } 
} 

據我所知,所使用的Apache CXF外匯類是不同的,那麼交易所然而,駱駝應該有一種在這兩種集成技術之間傳遞信息的方式?

+1

我想你可以訪問肥皂標題,您想要從路線中獲取信息。見http://camel.apache.org/cxf.html – soilworker

+0

嗨,我想要做同樣的事情。你能解決這個問題嗎? – Hector

回答

2

最後,我解決了它是如何遵循:

在我的背景,我有被路由到處理器駱駝CXF組件消費者服務。從駱駝

CxfEndpoint類有一個方法調用setInInterceptors:

public void setInInterceptors(List<org.apache.cxf.interceptor.Interceptor<? extends org.apache.cxf.message.Message>> interceptors) 

因此,如果我們在豆類定義下一個定義文件:

... 
<cxf:cxfEndpoint id="consumerId" 
    address="/myservice" 
    serviceClass="com.example.service.MyServiceSEI"> 
    <cxf:inInterceptors> 
     <ref bean="myInterceptor"/> 
    </cxf:inInterceptors> 
</cxf:cxfEndpoint> 

<bean id="myInterceptor" class="com.example.interceptors.MyInterceptor" /> 

然後,在我們的自定義攔截器,我們可以設置地圖中的任何變量

... 
import org.apache.cxf.binding.soap.SoapMessage; 
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; 
... 

public class MyInterceptor extends AbstractSoapInterceptor { 
    public MyInterceptor() { 
    super(Phase.RECEIVE); 
    } 

    @Override 
    public void handleMessage(SoapMessage message) throws Fault { 
    //..some logic and then setting a variable 

    message.getExchange().put("Foo", "Bar"); 
    } 
} 

最後,我們可以得到變量在我們的處理器,採用org.apache.cxf.message.Message類,從org.apache.camel.Message不同的使用Exchange.getIn()方法

import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.cxf.message.Message; 
import org.apache.camel.component.cxf.common.message.CxfConstants; 

public class MyCamelProcessor implements Processor { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     //how can I read information from CXF Intercptor here? 
     //how can I read "Foo" value? 
     Message cxfMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, Message.class); 
     String foo = (String) cxfMessage.getExchange().get("Foo"); 

     // read message from camel context 
     org.apache.camel.Message inMessage = exchange.getIn(); 
     ... 
    } 
} 

感謝:http://camel.465427.n5.nabble.com/Getting-entire-Soap-Message-with-header-and-body-in-Payload-mode-td5753162.html