2014-09-24 64 views
2

我目前正在嘗試熟悉Servicemix,Camel,CXF等,並且基本上與四年前有人在這裏的問題相同: How do I convert my BeanInvocation object in camel to a message body and headers? 不幸的是,對我很有幫助。正如答案中提到的那樣:駱駝網站上的所有示例都關注自己發送來自CXF的bean。Camel:Bean代理到CXF端點

我有我使用一個POJO一個bean代理端點,通過

@Produce(uri ="direct:start") 
MyService producer; //public interface example.MyService { void myMethod(MyObject o);} 

注入當我使用另一個Bean端點在另一端,實現該接口的消費者,這一切工作正常。我現在想要做的就是使用camel-cxf來消費實現該接口的Web服務。

<cxf:cxfEndpoint id="cxfEndpoint" 
    address="http://localhost:8080/MyService/services/MyService" 
    wsdlURL="http://localhost:8080/MyService/services/MyService?wsdl" 
    serviceName="s:MyService" 
    serviceClass="example.MyService" 
    endpointName="s:MyService" 
    xmlns:s="http://example" /> 

什麼我現在基本上試圖做的是,在RouteBuilder::我通過創建cxfEndpoint

from("direct:start").to("cxf:bean:cxfEndpoint"); 

但得到一個異常,試圖調用代理對象上的東西時:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Part  
{http://example}o should be of type example.MyObject, not 
org.apache.camel.component.bean.BeanInvocation 

據我瞭解,春節代理對象產生可被另一個bean端點消耗BeanInvocation對象,我要變成一個方式CXF可以生成一個SOAP再此追求它(或有一些自動轉換?)。

但我有點卡住這樣做: 我想作爲http://camel.apache.org/soap.html或寫我自己的處理器描述肥皂編組,但我也不知道,如果我只是失敗,或者如果這不是它應該如何工作。我也嘗試將cxfEndpoint設置爲不同的消息模式,但沒有成功。

任何指針,我應該普遍做的將不勝感激!

回答

3

因此經過一個星期的反覆試驗,我發現答案很簡單。如果cxfEndpoint設置爲POJO模式(默認),解決的辦法是隻獲取調用參數,並將它們塞進消息體來代替:

from("direct:start").process(new Processor() { 
     @Override 
     public void process(Exchange e) throws Exception { 
      final BeanInvocation bi = e.getIn().getBody(BeanInvocation.class); 
      e.getIn().setBody(bi.getArgs()); 
     } 
    }).to("cxf:bean:cxfEndpoint") 

我想這可能更優雅,雖然在某種程度上完成。

+0

我正在尋找相同問題的答案並找到您的解決方案。然而,我真的沒有得到答案,如果我們使用它來獲取參數,爲什麼我們應該將body設置爲BeanInvocation?這有什麼好處?相反,我們可以設置例如:\t \t \t \t \t MessageContentsList mclOut = new MessageContentsList(); \t \t \t \t mclOut.set(0,「aaa」); \t \t \t \t e.getIn()。setBody(mclOut); – cacert 2015-11-17 09:07:13