2014-07-01 106 views
0

我是駱駝新手,面臨着我需要設置的路由問題。如果有人能夠指導我參加正確的論壇,或者更好地解決我所面臨的問題,那將會很棒。 這是我需要做的 - 公開一個restlet端點來接受數據;使用此數據作爲外部SOAP Web服務的輸入,並將響應以JSON格式發送回調用方... 以下是我所做的...但是,當駱駝嘗試調用Web服務...任何人都可以在這裏指導我嗎?謝謝。Camel Restlet和CXF SOA集成問題

我使用駱駝2.11.1和CXF-CODEGEN插件版本2.7.11

我得到以下異常:org.restlet.data.Parameter不能轉換爲java.lang.String。

public class IntegrationTest extends CamelTestSupport { 

String restletURL = <url>; 

    @org.junit.Test 
    public void integTest() throws Exception { 
    //trying to simulate the rest service call... 
    template.sendBodyAndHeader(restletURL, "Body does not matter here", "data", "{\"FromCurrency\":\"AUD\",\"ToCurrency\":\"USD\"}"); 

    } 


    @Override 
    protected RouteBuilder createRouteBuilder() throws Exception { 
     return new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
      System.out.println("In Counfigure"); 

     String cxfEndpoint = "cxf://http://www.webservicex.net/CurrencyConvertor.asmx?" 
     + "wsdlURL=http://www.webservicex.net/CurrencyConvertor.asmx?wsdl&" 
     + "serviceName={http://www.webserviceX.NET/}CurrencyConvertor&" 
     + "portName={http://www.webserviceX.NET/}CurrencyConvertorSoap&" 
     + "dataFormat=MESSAGE"; 

     XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat(); 
     SoapJaxbDataFormat soap = new SoapJaxbDataFormat("net.webservicex", new ServiceInterfaceStrategy(CurrencyConvertorSoap.class, true)); 

     GsonDataFormat gson = new GsonDataFormat(ConversionRate.class); 
     gson.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); 

from(restletURL).routeId("Restlet") 
           .process(new Processor() { 
             @Override 
             public void process(Exchange exchange) throws Exception { 
               String data = (String) URLDecoder.decode((String) exchange.getIn().getHeader("data"), "UTF-8"); 
               System.out.println(data); 
               // get the mail body as a String 
               exchange.getIn().setBody(data); 
               Response.getCurrent().setStatus(Status.SUCCESS_OK); 
           } 

           }) 
       .unmarshal(gson) 
       .marshal(soap) 
       .log("${body}") 
       .to(cxfEndpoint) 
       .unmarshal(soap) 
       .marshal(xmlJsonFormat); 
       .log("${body}"); 
      } 
     }; 
    } 
} 

然而,抽樣工作,當我嘗試了各個部分 - 的Restlet和單獨CXF ...

感謝, Ritwick。

+0

下面是完整的異常堆棧(我是不允許進入的原題2個鏈接:2014年7月1日13:33:00228 [stlet-963335244] WARN PhaseInterceptorChain - Interceptor for {http://www.webserviceX.NET/}CurrencyConvertor#{http://www.webserviceX.NET/}ConversionRate拋出異常,立即展開 java.lang.ClassCastException: ClassCastException調用http://www.webservicex.net/CurrencyConvertor.asmx:org.restlet.data.Parameter不能轉換爲java.lang.String \t at sun.reflect.NativeConstructorAccessorImpl.newInstance0(N ative Method) –

+0

如果您自己執行編組和解組工作,則可以使用camel-http組件將請求重定向到真實的後端服務。這次你不需要使用camel-cxf。 –

+0

感謝Willem,我將嘗試使用camel-servlet組件來完成camel-restlet組件的工作。仍在努力...讓我們看看如何。 –

回答

0

我正面臨的問題已經解決。除了「exchange.getIn()。setBody(data);」之外,我還添加了下面這行代碼「exchange.getIn()。setHeader(」org.restlet.http.headers「,」「);」爲了擺脫我得到的類拋出異常。 restlet頭文件導致了這個問題,一旦這些頭文件被刪除(我不需要頭文件),一切都按預期工作。

謝謝, Ritwick。

+0

你能和我們分享駱駝路線嗎? –

2

當然威廉,這裏是整個配置實現:

@Override 
public void configure() throws Exception { 
     String restletURL = "restlet:http://localhost:8080/convert/{data}?restletMethods=get"; 

     String cxfEndpoint = "cxf://http://www.webservicex.net/CurrencyConvertor.asmx?" 
       + "portName={http://www.webserviceX.NET/}CurrencyConvertorSoap&" 
       + "dataFormat=MESSAGE&loggingFeatureEnabled=true&defaultOperationName=ConversionRate&defaultOperationNamespace={http://www.webserviceX.NET/}&synchronous=true"; 


     SoapJaxbDataFormat soap = new SoapJaxbDataFormat("net.webservicex", new ServiceInterfaceStrategy(CurrencyConvertorSoap.class, true)); 
     soap.setVersion("1.2"); 

     GsonDataFormat gson = new GsonDataFormat(ConversionRate.class); 
     gson.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); 

     from(restletURL).routeId("Restlet") 
     .process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       String data = (String) URLDecoder.decode((String) exchange.getIn().getHeader("data"), "UTF-8"); 
       exchange.getIn().setHeader("org.restlet.http.headers", ""); 
       exchange.getIn().setHeader("data", ""); 
       exchange.getIn().setBody(data); 
       Response.getCurrent().setStatus(Status.SUCCESS_OK); 
      } 

     }) 
     .unmarshal(gson) 
     .marshal(soap) 
     .to(cxfEndpoint) 
     .unmarshal(soap) 
     .marshal(gson) 
     .process(new Processor() { 
      public void process(Exchange exchange) throws Exception { 
       String output = exchange.getIn().getBody(String.class); 
       exchange.getOut().setBody(output); 
      } 
     }); 
    } 
+0

感謝Ritwick當時發佈解決方案,現在它幫助了我。 –

+0

@UmairSaleem,我很高興這篇文章很有幫助。 –