Apache Camel:使用SOAP的CXF:IndexOutOfBoundsException:来自HandleInInterceptor handleMessage(第67行),如何修复?

pkbketx9  于 12个月前  发布在  Apache
关注(0)|答案(1)|浏览(108)

我正在使用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)

我的路线-

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中失败了,OutHolders列表总是大小为1,所有元素都为null。这就是问题的根源。我没有关于这个outHolders对象的任何信息,请在此帮助-
或者我需要更换HolderInInterceptor吗?如果是这样,我们如何替换它?
先谢谢你了。

ahy6op9u

ahy6op9u1#

我也有同样的问题,发现这个问题没有答案,所以我想分享我的解决方案。
我的错误的原因是,生成的接口有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端的一个bug,还是我下载的Web服务端的wsdl定义不正确,但这个问题是由message中使用的元素和操作的名称相同引起的。
这里是一个github项目,我展示了我的问题Java CXF wsdl2java generation

相关问题