Camel:Bean代理到CXF端点

时间:2014-09-24 14:47:45

标签: java spring web-services cxf apache-camel

我目前正在努力熟悉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设置为不同的消息模式,但没有成功。

我非常感谢任何我应该做的事情!

1 个答案:

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

我想不管怎么说,这可以更优雅地完成。