我想从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
答案 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")