当前位置: 首页 > 知识库问答 >
问题:

Camel Reslet和CXF SOA集成问题

岳京
2023-03-14

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

我使用的是camel 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......

谢谢,里特维克。

共有2个答案

裘光启
2023-03-14

我面临的问题已经解决了。除了“exchange.getIn(). setbody(data);”之外,我还添加了以下代码行“exchange.getIn(). sethead er(org.restlet.http.headers ", "");" 为了摆脱我得到的类强制转换异常。reslet标头导致了这个问题,一旦这些标头被删除(我一开始不需要标头),一切都按预期工作。

谢谢,里特维克。

邢项禹
2023-03-14

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

@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);
            }
        });
    }
 类似资料:
  • 我在过程中创建一个Web应用程序在围棋使用贝戈(https://beego.me)。 我需要捕获Newrelic中的应用程序监控和计量指标,并能够查看Newrelic中的所有事务。 我遵循了此文档,正在使用Beego GoRelic在代码中初始化Newrelic代理。 这是我的router.go课 在我的应用程序中。conf,我提供了newrelic许可证密钥和应用程序名称,如下所示: 当我在模式

  • 我在将JProfiler连接到Linux上运行的远程WebSphere 8.5.5实例时遇到了一些问题。当我在我的Windows 10机器上启动JProfiler时,我选择“本地或远程配置应用程序服务器”,并选择与IBM WebSphere 8集成的选项。x应用服务器。 我遇到的问题是设置配置文件的“指定远程地址”部分。安装程序说我需要在目标JVM上运行分析代理。我从JProfiler网站下载ta

  • 我创建了一个新示例,并将代码分为客户端和服务器端。 完整的代码可以在这里找到。 服务器端有3个版本。 服务器无Spring Boot应用程序,使用Spring Integration RSocket InboundGateway 服务器引导重用Spring RSocket autconfiguration,并通过serverrsocketmessagehandler创建ServerRSocketC

  • 我在一个Salesforce环境中,试图使用docusign和Conga发送一个docusign文档。我在用30天的试验。 1.使用Conga和Docusign一起工作非常好,格式是正确的,除了我需要在表单上有2个单选按钮。有没有一种方法可以像我为Docusign签名和日期标记所做的那样,向我的Word文档添加锚标记并隐藏它们(白色文本)? 迈克尔

  • 我有spring boot项目(版本< code>2.4.6),带有spring数据依赖项(< code > spring-boot-starter-data-JPA )和postgreSQL驱动程序。 在项目中,我们使用Hibernate和数据存储库,通过以下方式配置: 我还想加入反应性R2DBC。我的计划是在一个特定的地方使用它,在那里我们与其他系统集成,这样的通信通过反应式数据流进行。根据它

  • 我正在Kafka(kafka_2.11-0.10.0.0)和OSB 12c(12.2.1.2)之间建立连接,以便在OSB上使用来自Kafka的消息。 我已经按照要求的步骤在OSB中安装了Kafka Transport,并成功运行,但是当我尝试使用来自Kafka的消息时,我得到以下错误: com . bea . wli . sb . transports . transport exception: