Проблема с интеграцией Camel Restlet и CXF SOA

#soap #cxf #apache-camel #gson #restlet

#мыло #cxf #апач-верблюд #gson #restlet #soap #apache-camel

Вопрос:

Я новичок в Camel и столкнулся с проблемой с маршрутом, который мне нужно настроить. Будет здорово, если кто-нибудь сможет направить меня на правильный форум или, что еще лучше, исправить проблему, с которой я сталкиваюсь. Вот что мне нужно сделать — предоставить конечную точку restlet для приема данных; используйте эти данные в качестве входных данных для внешней веб-службы SOAP и отправьте ответ в формате JSON обратно вызывающему… Вот что я сделал … однако, я получаю следующую ошибку, когда Camel пытается вызвать веб-службу…кто-нибудь может провести меня сюда? Спасибо.

Я использую camel 2.11.1 и cxf-codegen-plugin версии 2.7.11

Я получаю следующее исключение: org.restlet.data.Параметр не может быть приведен к java.lang.Строка.

     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?wsdlamp;" 
          "serviceName={http://www.webserviceX.NET/}CurrencyConvertoramp;" 
          "portName={http://www.webserviceX.NET/}CurrencyConvertorSoapamp;" 
          "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…

Спасибо, Ритвик.

Комментарии:

1. Вот полный стек исключений (мне не разрешили вводить 2 ссылки в исходном вопросе:2014-07-01 13:33:00,228 [stlet-963335244] ПРЕДУПРЕДИТЬ PhaseInterceptorChain — Interceptor для { webserviceX.NET }CurrencyConvertor#{ webserviceX.NET }ConversionRate вызвал исключение, которое теперь отключает java.lang. ClassCastException: вызов ClassCastException webservicex.net/CurrencyConvertor.asmx : org.restlet.data. Параметр не может быть приведен к java.lang. Строка в sun.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод)

2. Если вы выполняете маршалирование и отменяете маршалирование самостоятельно, вы можете просто использовать компонент camel-http для перенаправления запроса на реальную серверную службу. На этот раз вам не нужно использовать camel-cxf.

3. Спасибо Уиллем, я собираюсь попытаться использовать компонент camel-servlet для выполнения работы за компонент camel-restlet. Все еще работаем над этим … давайте посмотрим, как это происходит.

4. Привет, Уильям, я смог достичь того, что мне было нужно, используя компонент camel-servlet. Спасибо за ваше руководство. Спасибо, Ритвик

5. Привет, Уильям, я смог заставить работать и restlet… все, что требовалось, это дополнительная строка exchange.getIn().setHeader(«org.restlet.http.headers», «»); Как только я добавил это, маршрут сработал как по волшебству. Спасибо за вашу помощь. Ритвик.

Ответ №1:

Конечно, Уиллем, вот полная реализация конфигурации:

 @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/}CurrencyConvertorSoapamp;"
                  "dataFormat=MESSAGEamp;loggingFeatureEnabled=trueamp;defaultOperationName=ConversionRateamp;defaultOperationNamespace={http://www.webserviceX.NET/}amp;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. Спасибо Ритвику за публикацию решения в то время, это помогло мне сейчас.

2. @UmairSaleem, я рад, что сообщение было полезным.

Ответ №2:

Проблема, с которой я столкнулся, была решена. В дополнение к «exchange.getIn().setBody(data);» Я добавил следующую строку кода «exchange.getIn().setHeader(«org.restlet.http.headers», «»»);» чтобы избавиться от исключения приведения класса, которое я получал. Заголовки restlet вызывали эту проблему, и как только эти заголовки были удалены (мне не нужны заголовки в первую очередь), все работало так, как ожидалось.

Спасибо, Ритвик.

Комментарии:

1. Можете ли вы поделиться с нами маршрутом camel?