Camel Restlet和CXF SOA集成问题

时间:2014-07-01 20:25:36

标签: soap cxf apache-camel gson restlet

我是Camel的新手,我正面临一个我需要设置路线的问题。如果有人可以引导我到正确的论坛或更好地纠正我面临的问题,那将是很棒的。 这是我需要做的 - 公开一个restlet端点来接受数据;使用此数据作为外部SOAP Web服务的输入,并将响应以JSON格式发送回调用者... 以下是我所做的...但是,当Camel尝试调用Web服务时,我收到以下错误...任何人都可以在这里指导我吗?谢谢。

我使用的是camel 2.11.1和cxf-codegen-plugin版本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。

2 个答案:

答案 0 :(得分:2)

当然是Willem,这是整个配置实现:

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

答案 1 :(得分:0)

我面临的问题已得到解决。除了&#34; exchange.getIn()。setBody(data);&#34;之外,我添加了以下代码行&#34; exchange.getIn()。setHeader(&#34; org.restlet。 http.headers&#34;,&#34;&#34;);&#34;为了摆脱我得到的阶级演员异常。 restlet标题导致了这个问题,一旦这些标题被删除(我首先不需要标题),一切都按预期工作。

谢谢, Ritwick。