我目前正在努力熟悉Servicemix,Camel,CXF等,并且基本上和四年前有人在一起的问题相同: How do I convert my BeanInvocation object in camel to a message body and headers? 不幸的是,那里的答案对我帮助不大。正如其中一个答案所提到的:Camel网站上的所有示例都关注从CXF发送到 bean的内容。
我有一个bean代理端点,我在POJO中使用,通过
注入@Produce(uri ="direct:start")
MyService producer; //public interface example.MyService { void myMethod(MyObject o);}
当我在另一端使用另一个bean端点时,为该接口实现一个使用者,这一切都正常。我现在想要做的是使用camel-cxf来使用实现该接口的Web服务。我通过以下方式创建了一个cxfEndpoint:
<cxf:cxfEndpoint id="cxfEndpoint"
address="http://localhost:8080/MyService/services/MyService"
wsdlURL="http://localhost:8080/MyService/services/MyService?wsdl"
serviceName="s:MyService"
serviceClass="example.MyService"
endpointName="s:MyService"
xmlns:s="http://example" />
我现在基本上要做的是,在RouteBuilder中:
from( "direct:start" ).to( "cxf:bean:cxfEndpoint" );
但在尝试在代理对象上调用某些东西时会得到一个异常:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Part
{http://example}o should be of type example.MyObject, not
org.apache.camel.component.bean.BeanInvocation
根据我的理解,Spring代理对象生成一个BeanInvocation对象,可以被另一个bean端点使用,我必须将其转换为cxf可以从中生成SOAP请求的方式(或者是否有一些自动化转换?)。
但我有点坚持这样做: 我按http://camel.apache.org/soap.html所述尝试了肥皂编组或编写了我自己的处理器,但我甚至不确定我是否失败了,或者这不是它应该如何工作的。我还尝试将cxfEndpoint设置为不同的消息模式,但没有成功。
我非常感谢任何我应该做的事情!
答案 0 :(得分:3)
经过一周的反复试验,我发现答案很简单。如果cxfEndpoint设置为POJO模式(默认值),解决方案就是抓住调用参数并将它们填充到消息体中:
from( "direct:start" ).process( new Processor() {
@Override
public void process( Exchange e) throws Exception {
final BeanInvocation bi = e.getIn().getBody( BeanInvocation.class );
e.getIn().setBody( bi.getArgs() );
}
} ).to( "cxf:bean:cxfEndpoint" )
我想不管怎么说,这可以更优雅地完成。