CXF & Camel:不支持 List<Object> 作为 Web 服务参数

Posted

技术标签:

【中文标题】CXF & Camel:不支持 List<Object> 作为 Web 服务参数【英文标题】:CXF & Camel : does not support List<Object> as web service parameter 【发布时间】:2018-11-04 21:30:00 【问题描述】:

我正在使用 JBoss Fuse 6.3 开发使用 Camel 和 CXF 组件 (2.17.0) 的 Web 服务。我也使用“代码优先”的方法。我发现使用一个简单的对象作为参数(doSomething 方法)很顺利,但无法使用对象列表作为参数(更新方法)。以下是调查结果:

@WebService
public java.util.List<ObjectResponse> update(
    java.util.List<ObjectRequest> arg0
);
public ObjectResponse doSomething(
    Object parameter
);

  address="http://...."
  endpointName="ws:MyServicePort" id="MyService"
  loggingFeatureEnabled="true"
  serviceClass="com...MyService"
  <cxf:properties>;
      <entry key="dataFormat" value="POJO"/>
  </cxf:properties>
</cxf:cxfEndpoint>

当arg0只包含一个元素(ObjectRequest)时,它不会抛出错误,但是web服务请求没有内容:

信封>

当 arg0 有两个元素时,它会抛出以下错误:

java.lang.IllegalArgumentException: Get wrong parameter size to invoke out service, Expect size 1, Parameter size 2. 请检查消息体是否匹配CXFEndpoint POJO Dataformat请求。 在 org.apache.camel.component.cxf.CxfProducer.checkParameterSize(CxfProducer.java:272)[241:org.apache.camel.camel-cxf:2.17.0.redhat-630187] 在 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]

【问题讨论】:

标题应该是:CXF & Camel : 不支持 List 作为 Web 服务参数。 【参考方案1】:

解决方法是在设置交换体时,将List包裹在一个对象数组中,如下所示

java.util.List arg0 = new ArrayList();

ObjectRequest obj1;//需要初始化

ObjectRequest obj2;//需要初始化

arg0.add(obj1);

arg0.add(obj2);

exchange.getIn().setBody(new Object[] arg0);

【讨论】:

以上是关于CXF & Camel:不支持 List<Object> 作为 Web 服务参数的主要内容,如果未能解决你的问题,请参考以下文章

apache camel 条件路由

为什么Aries Blueprint没有为camel-cxf和camel-blueprint注册名称空间处理程序?

在camel cxf客户端请求中的Http头Content-Length

将 Camel CXF 代理部署到 Red Hat JBoss Fuse

将 CXF 与 Apache Camel 一起使用时,如何设置 WS-Addressing MessageId 标头?

使用servlet传输Jboss fuse 6.3公开https camel cxf webservice