Производитель Camel cxfws, формат POJO, выдает неправильный размер параметра, чтобы вызвать ошибку службы вывода

У меня аналогичная ситуация с режимом 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, добавив несколько нулей, но он не работает с ошибкой «несоответствие типа аргумента». Пожалуйста, помогите мне понять части входного сообщения в этой конкретной операции.


person Sowjanya Mudimala    schedule 25.05.2018    source источник
comment
Пожалуйста, покажите нам свои POJO и CxfEndpoint.   -  person Erik Karlstrand    schedule 25.05.2018
comment
Спасибо за ответ. добавил детали в описание.   -  person Sowjanya Mudimala    schedule 25.05.2018


Ответы (1)


Я обошел эту проблему, НЕ используя параметр «-exsh true» при создании wsdl и устанавливая заголовки SOAP с помощью заголовка Holders.LIST. При этом мне пришлось установить mustUnderstand = true для CredentialsHeader.

наконец, я добавил заголовки в запрос SOAP. Но я действительно хочу знать, почему путь передачи всех заголовков плюс тело в виде списка параметров (с опцией «-exsh true») не работал. У меня был точно такой же подход, работающий для другого веб-сервиса, но не для этого. Мне интересно, в чем разница.

Пожалуйста, поделитесь, если у кого-то есть понимание.

person Sowjanya Mudimala    schedule 31.05.2018