从Camel调用Web服务

时间:2012-10-30 12:21:57

标签: web-services apache cxf apache-camel

我想从Camel调用Web服务。但是每次我打电话给服务我都会收到空。 你能帮我找一个解决方案吗?

该服务在tomcat上运行,我可以使用soapUI进行测试。以下是SoapUI的请求。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:hel="http://helloworld.localhost">
    <soapenv:Header/>
       <soapenv:Body>
          <hel:HelloWorldRequest>
               <hel:input>Pavel</hel:input>
          </hel:HelloWorldRequest>
       </soapenv:Body>
    </soapenv:Envelope>

并且响应返回Hello Pavel。 我按照CamelInAction指南创建了合同第一个Web服务。 我能够运行读取文件的路径并将其发送到Web服务。

路线的代码如下。

public class FileToWsRoute extends RouteBuilder {
public void configure() { 
    from("file://src/data?noop=false")
    .process(new FileProcessor())
    .to("cxf:bean:helloWorld");
    }

}

FileProcessor类如下所示:

public class FileProcessor implements Processor {

public void process(Exchange exchange) throws Exception {

    System.out.println("We just downloaded: " 
            + exchange.getIn().getHeader("CamelFileName"));
    String text = 
    "<?xml version='1.0' ?>" 
    +"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:hel=\"http://helloworld.localhost\">"
    +"<soapenv:Header/>"
    +   "<soapenv:Body>"
    +     " <hel:HelloWorldRequest>"
    +        " <hel:input>WhatsUP</hel:input>"
    +     " </hel:HelloWorldRequest>"
    +   "</soapenv:Body>"
    +"</soapenv:Envelope>";

    exchange.getIn().setBody(text);
}
}

在下一个版本中,我想通过cxf-codegen-plugin生成的对象生成请求(HalloWorld.java,HelloWorldImpl.java,HelloWorldRequest.java,HelloWorldResponse.java,HelloWorldService.java,ObjectFactory.java,package- info.java)。

在camel-cxf.xml中我有:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:cxf="http://camel.apache.org/schema/cxf"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://camel.apache.org/schema/cxf 
     http://camel.apache.org/schema/cxf/camel-cxf.xsd">

  <import resource="classpath:META-INF/cxf/cxf.xml"/>
  <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
  <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml"/>

  <cxf:cxfEndpoint id="helloWorld"
               address="http://localhost:8080/ode/processes/HelloWorld"
               serviceClass="localhost.helloworld.HelloWorld"
               wsdlURL="wsdl/HelloWorld.wsdl"/>
</beans>

要从Web服务读取响应,我正在使用此路由。

public class WsToQueueRoute extends RouteBuilder {
    public void configure() { 
    from("cxf:bean:helloWorld")
    .to("seda:incomingOrders")
    .transform().constant("OK");
    }

}

最后一条路线从seda获取数据......

public class QueueToProcessRoute extends RouteBuilder {
public void configure() { 
    from("seda:incomingOrders")
    .process(new PrintResult());
    }

}

...并打印结果。

public class PrintResult implements Processor {

public void process(Exchange exchange) throws Exception {

    System.out.println("Data received: " 
            + exchange.getIn().getBody(String.class));
}

}

执行的输出是: 收到的数据:null

我希望能用cxf对象解析一些XML文件。你能帮我找到问题吗?

谢谢

的Pavel

2 个答案:

答案 0 :(得分:3)

此示例的问题出现在FileProcessor和PrintResult类中。我也简化了这个例子,所以我现在只使用一条路线FileToWsRoute。

public class FileToWsRoute extends RouteBuilder {
public void configure() { 
    from("file://src/data?noop=true")
    .process(new FileProcessor())
    .to("cxf:bean:helloWorld")
    .process(new PrintResult());
    }
}

FileProcessor已更改为此。

public class FileProcessor implements Processor {

public void process(Exchange exchange) throws Exception {
        HelloWorldRequest hs = new HelloWorldRequest();
        hs.setInput("Pavel");
        exchange.getOut().setBody(hs);
    }
}  

PrintProcessor已更改为此。

public class PrintResult implements Processor {
public void process(Exchange exchange) throws Exception {
    MessageContentsList msgList = (MessageContentsList) exchange.getIn().getBody();
    HelloWorldResponse resp = (HelloWorldResponse) msgList.get(0);
    String result = resp.getResult();       
       System.out.println("Data received: " + result);
    }

}

我认为对于那些与骆驼和网络服务斗争的人来说,这是一个很好的例子。

答案 1 :(得分:0)

问题可能在于发送到process方法的数据格式。我会尝试将camel cxf属性添加到端点,如下所示:

<cxf:properties>
    <entry key="dataFormat" value="POJO"/> 
</cxf:properties>

通过将dataformat更改为POJO,您应该会收到您的消息。因此,您的camel cxf端点应如下所示:

  <cxf:cxfEndpoint id="helloWorld"
               address="http://localhost:8080/ode/processes/HelloWorld"
               serviceClass="localhost.helloworld.HelloWorld"
               wsdlURL="wsdl/HelloWorld.wsdl">
    <cxf:properties>
        <entry key="dataFormat" value="POJO"/> 
    </cxf:properties>
  </cxf:cxfEndpoint>

我曾经遇到过类似的问题,这解决了我的问题,但是我在Spring中使用了驼峰而不是java类。

如果这不起作用,请尝试在您的路线中添加参数:?dataFormat=POJO,如下所示:

from("cxf:bean:helloWorld?dataFormat=POJO")