当前位置: 首页 > 知识库问答 >
问题:

Camel cxfws producer,POJO格式,抛出“获取错误的参数大小来调用out服务”错误

鱼阳伯
2023-03-14

我的情况与使用Java DSL的Camel CXF POJO模式类似,其中

  • 我有一个wsdlhttps://api.stage.eventcore.com/ReportService.asmx?WSDL
  • 创建了wsdl2java库
  • 使用camel-cxf生产者组件和POJO格式发出SOAP请求
  • operationnameoperationnamespace设置为标头cxfEndpoint也被正确配置

以下是我在“获取报告”操作中遇到的错误。

java.lang.IllegalArgumentException: Get the wrong parameter size to invoke the out service, Expect size 7, Parameter size 4.
Please check if the message body matches the CXFEndpoint POJO Dataformat request.

这是我正在处理的操作的绑定信息。

<wsdl:operation name="GetReport">
<soap:operation soapAction="https://api.eventcore.com/GetReport" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:GetReportAuthTokenHeader" part="AuthTokenHeader" use="literal"/>
<soap:header message="tns:GetReportCredentialsHeader" part="CredentialsHeader" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
<soap:header message="tns:GetReportAuthTokenHeader" part="AuthTokenHeader" use="literal"/>
</wsdl:output>
</wsdl:operation>

作为交换体的一部分,我发送了一个带有CredentialHeader的对象列表,带有必要数据的GetReport对象。我还为响应消息添加了持有者参数。

GetReport getReport = new GetReport();
getReport.setReportID(123);
getReport.setSortColumn("LastModified");
getReport.setStartRow(1);
getReport.setEndRow(2);
getReport.setSortAscending(true);
ReportFilter filter = new ReportFilter();
filter.setField("LastModified");
filter.setComparison(ComparisonType.GREATER_THAN);
filter.setMatchValue("2018-05-09T23:23:51.8769404Z");
filter.setMode(FilterMode.SELF);
getReport.setFilter(filter);

CredentialsHeader credentials = new CredentialsHeader();
credentials.setUserName("foo");
credentials.setPassword("bar");
credentials.setEventID(11111);

List<Object> params = new ArrayList<Object>();
params.add(getReport);
params.add(credentials);
params.add(null); //params.add(new AuthTokenHeader());
params.add(new javax.xml.ws.Holder<AuthTokenHeader>());
//params.add(new javax.xml.ws.Holder<GetReportResponse>());

exchange.getIn().setBody(params);

这里是cxfEndpoint配置。

org.apache.camel.component.cxf.CxfEndpoint endpoint_cSOAP_1 = getCxfEndpoint(
                "cxf://"
                        + "https://api.stage.eventcore.com/ReportService.asmx"
                        + "?dataFormat=POJO"
                        + "&serviceClass="
                        + "tableau.ea.eventcore.api.reportservice.ReportServiceSoap"
                        + "&serviceName="
                        + "{https://api.eventcore.com/}ReportService"
                        + "&endpointName="
                        + "{https://api.eventcore.com/}ReportServiceSoap"
                        + "&defaultOperationNamespace="
                        + javax.xml.namespace.QName.valueOf(
                                "{https://api.eventcore.com/}GetReport")
                                .getNamespaceURI()
                        + "&defaultOperationName="
                        + javax.xml.namespace.QName.valueOf(
                                "{https://api.eventcore.com/}GetReport")
                                .getLocalPart() + "&" + "loggingFeatureEnabled"
                        + "=" + "true" + "&" + "continuationTimeout" + "="
                        + 600000
                        + "&headerFilterStrategy=#CXF_PAYLOAD_HEADER_FILTER"
                        + "&properties.id=" + "cSOAP_1", false, false, false,
                (String[]) null);

我不明白的是,为什么cxf需要7个参数?这7个参数是什么?我尝试通过添加一些null将其设置为7,但由于“参数类型不匹配”错误而失败。请帮助我了解此特定操作中的输入消息部分。

共有1个答案

蒋星驰
2023-03-14

我在生成wsdl时不使用“-exsh true”选项,并使用Holders.LIST标头设置SOAP标头,从而解决了这个问题。

最后,我将消息头添加到SOAP请求中。但是,我真的想知道为什么将所有的头和主体作为参数列表传递(带有"-exsh true "选项)的路径不起作用。我用完全相同的方法为不同的网络服务工作,但不是为这个。我很好奇是什么造成了这种差异。

如果有人有见解,请分享。

 类似资料:
  • 试图调试这个简单的NodeJS socketIO服务器。 我在启动时不断收到以下错误消息。我看不出代码有什么问题。 TypeError:侦听器必须是服务器上Namespace.EventEmitter.AddListener(Events.js:130:11)处的TypeError()处的函数。(匿名函数)[如上](/users/foo/bin/node_modules/socket.io/lib

  • 问题内容: 我收到以下错误: 这来自以下代码: 首先,我将每个库都包含在http://code.google.com/p/gdata-java- client/downloads/list中, 并且还导入了比我需要的更多的库。从那以后,我删除了我认为不必要的库)。因此,我当前包含的库是以下库: (那里可能有一些不必要的库…但是,我快要结束了…)我只是想测试获得YouTube服务的能力,这样我就可以

  • 我试图使用RPC连接到我的M12 CordaApp并调用nodeIdentity()方法,我得到了org。bouncycastle。cert.CertIOException证书。我认为Java客户端代码可以工作,我可以看到RPC连接,当我尝试调用getProtocolVersion()时,我看到的是正确的协议版本。 以下是调用nodeIdentity()时的堆栈跟踪: 看起来X509证书序列化有问

  • 问题内容: 我们有一个较旧的ASP.NET WebForms应用程序,该应用程序通过在客户端使用jQuery 调用来执行AJAX请求,并在用属性修饰的代码背后的页面中调用静态方法。 如果WebMethod中发生未处理的异常,它将不会触发该事件,因此不会被我们的错误记录器(ELMAH)接收。这是众所周知的,不是问题- 我们将所有WebMethod代码包装在try-catch块中,但例外情况已手动记录

  • 问题内容: 我正在使用Direct Web Remoting(DWR)JavaScript库文件,并且仅在Safari(台式机和iPad)中出现错误 它说 超出最大呼叫堆栈大小。 该错误的确切含义是什么,它会完全停止处理吗? 也适用于浏览器的所有修复程序(实际上在上, JS:执行超出超时 我假设是相同的调用堆栈问题) 问题答案: 这意味着在代码的某处,你正在调用一个函数,该函数又调用另一个函数,依

  • 我想从我的对象生成一个JSON字符串: 每次我尝试这样做,我得到这个错误: 这些是我的BomItem类的属性: 我引用的BomModule类的属性: 知道是什么导致了这个错误吗?我该如何修复它?