我正在使用JBoss Fuse 6.3使用Camel和CXF组件(2.17.0)开发Web服务。我也使用“代码优先”的方法。我发现一个简单的对象作为参数(doSomething方法)很顺利,但是无法使用List of Objects作为参数(更新方法)。以下是调查结果:
@WebService
public java.util.List<ObjectResponse> update(
java.util.List<ObjectRequest> arg0
);
public ObjectResponse doSomething(
Object parameter
);
&LT; CXF:cxfEndpoint
address="http://...."
endpointName="ws:MyServicePort" id="MyService"
loggingFeatureEnabled="true"
serviceClass="com...MyService"
<cxf:properties>;
<entry key="dataFormat" value="POJO"/>
</cxf:properties>
</cxf:cxfEndpoint>
&lt; to uri =“cxf:bean:MyService?defaultOperationName = update”/&gt;
当arg0只包含一个元素(ObjectRequest)时,它不会抛出错误,但Web服务请求没有内容:
&lt; soap:Envelope xmlns:soap =“http://schemas.xmlsoap.org/soap/envelope/”&gt;&lt; soap:Body&gt;&lt; ns2:update xmlns:ns2 =“http:// ......“/&GT;&LT; /皂:身体与GT;&LT; /皂:信封&GT;
当arg0有两个元素时,会抛出以下错误:
java.lang.IllegalArgumentException:获取错误的参数大小以调用out服务,Expect size 1,Parameter size 2.请检查消息正文是否与CXFEndpoint POJO Dataformat请求匹配。 at org.apache.camel.component.cxf.CxfProducer.checkParameterSize(CxfProducer.java:272)[241:org.apache.camel.camel-cxf:2.17.0.redhat-630187] at org.apache.camel.component.cxf.CxfProducer.getParams(CxfProducer.java:310)[241:org.apache.camel.camel-cxf:2.17.0.redhat-630187] 在org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:120)[241:org.apache.camel.camel-cxf:2.17.0.redhat-630187] 在org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)[232:org.apache.camel.camel-core:2.17.0.redhat-630187]
答案 0 :(得分:0)
解决方案是在设置交换体时,将List包裹在一个对象数组周围,如下面的
所示java.util.List arg0 = new ArrayList();
ObjectRequest obj1; //需要初始化
ObjectRequest obj2; //需要初始化
arg0.add(OBJ1);
arg0.add(OBJ2);
exchange.getIn()。setBody(new Object [] {arg0});