我有与使用 Java DSL 的 Camel CXF POJO 模式类似的情况,其中
- 我有一个 wsdl https://api.stage.eventcore.com/ReportService.asmx?WSDL
- 创建了一个 wsdl2java 库
- 使用 camel cxf producer 组件,以 POJO 格式发出 SOAP 请求。
- 将
operationname
,设置operationnamespace
为标题。cxfEndpoint
配置也很准确。
以下是我在“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,但由于“参数类型不匹配”错误而失败。请帮助我理解此特定操作中的输入消息部分。