У меня аналогичная ситуация с режимом Camel CXF POJO с использованием Java DSL, где
- У меня есть wsdl https://api.stage.eventcore.com/ReportService.asmx?WSDL
- Создал библиотеку wsdl2java.
- Использование компонента производителя camel cxf с форматом 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 Object с необходимыми данными. Я также добавил параметры держателя для ответного сообщения.
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, добавив несколько нулей, но он не работает с ошибкой «несоответствие типа аргумента». Пожалуйста, помогите мне понять части входного сообщения в этой конкретной операции.