我正在使用Apache Camel Route,在那里我需要执行Soap API调用,对于Soap API,我正在使用Cxf库,而使用它时,我得到如下错误-
09:45:12.430 [default-workqueue-1] WARN org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {urn:dictionary:com.chargepoint.webservices}chargepointservices#{urn:dictionary:com.chargepoint.webservices}getTransactionData has thrown exception, unwinding now
java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:459)
at org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:67)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:808)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1701)
My Route -
from("direct:testSoapStart")
.log("TestSoapApiRoute Initiated.")
.process(this.soapRequestProcessor)
//.setHeader(OPERATION_NAME, constant("getCPNInstances"))
//.setHeader(OPERATION_NAME, constant("getOrgsAndStationGroups"))
.setHeader(OPERATION_NAME, constant("getTransactionData"))
.setHeader(OPERATION_NAMESPACE, constant("urn:dictionary:com.chargepoint.webservices"))
.toD("URL?"
+ "serviceClass=dictionary.com_chargepoint_webservices.Chargepointservices"
+ "&wsdlURL=/wsdl/cp_api_5.1.wsdl")
.log("body :: ${body}")
.process(this.soapResponseProcessor)
.log("TestSoapApiRoute Completed.")
.end();
在我的SoapRequestProcessor -我正在添加Header和body -
exchange.getIn().setHeader(Header.HEADER_LIST, soapHeaders);
exchange.getIn().setBody(new Object[]{new GetTransDataSearchRequest()});
我不知道为什么它在HolderInInterceptor失败,ouholder列表总是有大小一个,所有元素都是空的。这就是问题的根源。我没有关于这个ouholder对象的任何信息,请在此提供帮助-
或者我需要替换HolderInInterceptor吗?如果是的话,我们如何替换它呢?
提前感谢。
我也有同样的问题,发现这个问题没有答案,所以我想分享我的解决方案。
我的错误的原因是,生成的接口有void方法,而不是正确的返回类型。输入对象字段和输出对象字段都被添加为void方法的输入参数。我的路由是只设置请求参数,而不准备响应参数的持有者。从错误IndexOutOfBoundsException: Index 1 out of bounds for length 1
我猜你有一个单一的字段(索引=0)在请求元素,所以它试图找到第一个输出参数持有人(HolderInInterceptor.java行67)。
只有当操作的定义中没有输出消息时,才应该生成void方法。
因此,如果接口方法被正确地生成为void方法,您应该修改路由,在.to()
方法之前设置所有具有javax.xml.ws.Holder<java.lang.String>
等持有人的输出字段。
在我的例子中,我有输入和输出消息,但它仍然生成void方法。我不知道这是CXF方面的错误,还是wsdl在我下载它的web服务方面没有正确定义,但问题是由消息中使用的元素和操作名称具有相同的名称引起的。
这是一个github项目,在这里我展示了我的问题Java CXF wsdl2java生成