0

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

以下是我在“GetReport”操作中遇到的错误。

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 个参数是什么?我尝试通过添加一些空值将其设为 7,但由于“参数类型不匹配”错误而失败。请帮助我理解此特定操作中的输入消息部分。

4

1 回答 1

0

我通过在生成 wsdl 时不使用“-exsh true”选项并使用 Holders.LIST 标头设置 SOAP 标头来解决此问题。这样做时,我必须为 CredentialsHeader 设置 mustUnderstand = true。

最后,我将标头添加到 SOAP 请求中。但是,我真的很想知道为什么将所有标题和正文作为参数列表(使用“-exsh true”选项)传递的路径不起作用。我有完全相同的方法为不同的 web 服务工作,但不适用于这个。我很好奇有什么不同。

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

于 2018-05-31T00:00:06.937 回答