在处理包含java.util.List的响应时,在Camel路由中获取ClassCastException

时间:2014-01-01 11:51:41

标签: cxf apache-camel

我将Camel路由作为CXF Web服务公开。这是一个自下而上的Web服务,并且具有如下操作:

List<Book> getBooks();

CXF端点定义为:

<cxf:cxfEndpoint id="bookService" 
                 address="http://localhost:9045/bookservice" 
                 serviceClass="org.test.cxfws.service.BookDBService">        
</cxf:cxfEndpoint>

该操作查询书籍列表并将其返回给调用者。 Camel路线看起来像这样:

<camel:camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="cxf:bean:bookService"/>
        <choice>                
            <when>                    
                <simple>${header.operationName} == 'getBooks'</simple>                    
                <to uri="bean:wsImplBean?method=getBooks"/>
            </when>
            <to uri="log:outboundSoapResponse"/>
         <choice>
     </route>
</camel:camelContext>

运行路线后,我收到以下异常:

  

org.apache.cxf.interceptor.Fault:org.test.cxfws.service.Book无法强制转换为java.util.List       at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:117)       在org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)       at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)       在org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)       ...

     

引起:java.lang.ClassCastException:org.test.cxfws.service.Book无法强制转换为java.util.List       at org.test.cxfws.service.GetBooksResponse_WrapperTypeHelper1.createWrapperObject(Unknown Source)       at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:101)

我可以看到bean wsImpBean中的getBooks方法被执行,结果在路径中 choice 块的末尾返回:

  

[qtp1653072092-14] outboundSoapResponse INFO Exchange [ExchangePattern:InOut,BodyType:java.util.ArrayList,Body:[org.test.cxfws.service.Book@63f1858b,org.test.cxfws.service.Book@5769bf0 ,org.test.cxfws.service.Book@2df7ac5d,org.test.cxfws.service.Book @ 5f55253e,org.test.cxfws.service.Book@4f003a57]]

有人可以帮我理解ClassCastException的原因。

感谢。

1 个答案:

答案 0 :(得分:1)

作为camel-cxf使用list来保存处理InOut参数的响应。将响应结果设置到消息正文中时,需要将结果包装到List中,就像这样

List<Book> books ... 
List<Object> resultList = new ArrayList<Object>(); 
resultList.add(books); 
exchange.getOut().setBody(resultList);