Cxf 在处理包含java.util.List的响应时在Camel路由中获取ClassCastException
我有一个驼峰路由作为CXF web服务公开。这是一个自底向上的web服务,其操作如下: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
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)谢谢你,威廉。