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

Cxf 在处理包含java.util.List的响应时在Camel路由中获取ClassCastException,cxf,apache-camel,Cxf,Apache Camel,我有一个驼峰路由作为CXF web服务公开。这是一个自底向上的web服务,其操作如下: List<Book> getBooks(); List getbook(); CXF端点定义为: <cxf:cxfEndpoint id="bookService" address="http://localhost:9045/bookservice" serviceClass="org.test.cxfws.ser

我有一个驼峰路由作为CXF web服务公开。这是一个自底向上的web服务,其操作如下:

List<Book> getBooks();
List getbook();
CXF端点定义为:

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

该操作查询书籍列表并将其返回给调用者。骆驼路线如下所示:

<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>

${header.operationName}=='getBooks'
运行路由后,我得到以下异常:

org.apache.cxf.interceptor.Fault:org.test.cxfws.service.Book不能强制转换为java.util.List 位于org.apache.cxf.jaxws.interceptors.wrappersclassoutiterceptor.handleMessage(wrappersclassoutiterceptor.java:117) 位于org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 位于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 在org.test.cxfws.service.GetBooksResponse_WrapperTypeHelper1.createWrapperObject(未知源) 位于org.apache.cxf.jaxws.interceptors.wrappersclassoutiterceptor.handleMessage(wrappersclassoutiterceptor.java:101)

我可以看到,执行了来自bean wsImpBean的getBooks方法,并在路由中的选项块末尾返回结果:

[qtp1653072092-14]outboundSoapResponse信息交换[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


谢谢。

因为camel cxf使用列表来保存处理InOut参数的响应。当您将响应结果设置到消息体中时,您需要像下面这样将结果包装到一个列表中

List<Book> books ... 
List<Object> resultList = new ArrayList<Object>(); 
resultList.add(books); 
exchange.getOut().setBody(resultList); 
列出书籍。。。
List resultList=new ArrayList();
结果列表。添加(书籍);
exchange.getOut().setBody(结果列表);

在获得Willem的帮助后,我找到了另一种方法,可以将列表添加到MessageContentsList:
List lstBook=populateList();MessageContentsList msgContentList=exchange.getIn().getBody(MessageContentsList.class);msgContentList.add(lstBook)