Производитель Camel cxfws, формат POJO, выдает ошибку «Получить неверный размер параметра для вызова службы out» - PullRequest
0 голосов
/ 25 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

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

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

Просьба поделиться, если у кого-то есть понимание.

0 голосов
/ 30 мая 2018

Позже я понял, что эта операция имеет неявные заголовки SOAP, и мне пришлось использовать «-exsh true» при создании библиотеки wsdl2java.

Теперь я могу видеть класс Porttype в библиотеке, принимающей заголовки в качестве параметров.

public abstract void getReport(
@WebParam(name="reportID", targetNamespace="https://api.eventcore.com/") Integer paramInteger1, 
@WebParam(name="reportName", targetNamespace="https://api.eventcore.com/") String paramString1, 
@WebParam(name="sortColumn", targetNamespace="https://api.eventcore.com/") String paramString2, 
@WebParam(name="sortAscending", targetNamespace="https://api.eventcore.com/") boolean paramBoolean, 
@WebParam(name="startRow", targetNamespace="https://api.eventcore.com/") Integer paramInteger2, 
@WebParam(name="endRow", targetNamespace="https://api.eventcore.com/") Integer paramInteger3, 
@WebParam(name="filter", targetNamespace="https://api.eventcore.com/") ReportFilter paramReportFilter, 
@WebParam(mode=WebParam.Mode.INOUT, name="AuthTokenHeader", targetNamespace="https://api.eventcore.com/", header=true) Holder<AuthTokenHeader> paramHolder, 
@WebParam(name="CredentialsHeader", targetNamespace="https://api.eventcore.com/", header=true) CredentialsHeader paramCredentialsHeader, 
@WebParam(mode=WebParam.Mode.OUT, name="GetReportResult", targetNamespace="https://api.eventcore.com/") Holder<GetReportResponse.GetReportResult> paramHolder1, 
@WebParam(mode=WebParam.Mode.OUT, name="recordCount", targetNamespace="https://api.eventcore.com/") Holder<Integer> paramHolder2);

Я устанавливаю список параметров, как показано ниже.

List<Object> params = new ArrayList<Object>();
params.add(1037); //reportID
params.add(null); //reportName
params.add("LastModified"); //sortColumn
params.add(true); //sortAscending
params.add(1); //startRow
params.add(2); //endRow
params.add(filter); //filter
params.add(new javax.xml.ws.Holder<AuthTokenHeader>()); // INOUT soap header
params.add(credentials); // IN Soap Header
params.add(new javax.xml.ws.Holder<GetReportResponse.GetReportResult>()); // Out Body
params.add(new javax.xml.ws.Holder<Integer>()); // Out parameter

Но, я все еще получаю сообщение об ошибке

Get the wrong parameter size to invoke the out service, Expect size 10, Parameter size 11. Please check if the message body matches the CXFEndpoint POJO Dataformat request.

Когда я посмотрел код CxfProducer (метод checkParameterSize), похоже, что он получает soapHeadersSize как 0, даже думал, что там2 SOAP-заголовка ввода.

есть какие-либо подсказки, как решить эту проблему?

...