我将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的原因。
感谢。
答案 0 :(得分:1)
作为camel-cxf使用list来保存处理InOut参数的响应。将响应结果设置到消息正文中时,需要将结果包装到List中,就像这样
List<Book> books ...
List<Object> resultList = new ArrayList<Object>();
resultList.add(books);
exchange.getOut().setBody(resultList);