Обработайте Json массив из веб-сервиса RestFul и перейдите на soap - PullRequest
0 голосов
/ 15 апреля 2020

Я разрабатываю приложение-мост, которое отправляет soap запросов в веб-службу Restful и возвращает ответ в soap.

Ответ Restful Webservice выглядит примерно так

[
  {
    "agenzia": "string",

    "allegato": [
      {
        "fileName": "string",
        "body": "string",
        "mimeType": "string"
      }
    ]
  }
]

Я использую Spring Boot Framework для разработки этого. Я сгенерировал java файлов из XSD (исключая класс «RetrieveRichiesta»), затем я создал класс DTO (класс «RetrieveRichiestaResponseDto») для обработки ответа от веб-сервиса. Класс API -

public RetrieveRichiestaResponse RetrieveRichiesta(RetrieveRichiestaRequest request){
        //LOGGER.info("Servizio richiamato "+ url + "api/incident/retrieveincident");

        // Call the API
        RestTemplate restTemplate = new RestTemplate();
        // Add Interceptor
        restTemplate.setInterceptors(Collections.singletonList(new RequestResponseLoggingInterceptor()) );

        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.setContentType(MediaType.APPLICATION_JSON);

        final String uri = url + "/api/incident/retrieveincident";        
        Map<String,String> input = new HashMap<>();
        input.put("id_CRM", request.getIdCRM());
        input.put("tipo", request.getTipo());
        input.put("fonte", request.getFonte());

        HttpEntity<?> entity = new HttpEntity<>(input,headers);

        RetrieveRichiestaResponseDto result = restTemplate.postForObject(
                uri,
                entity,
                RetrieveRichiestaResponseDto.class);

        // Transform response RetrieveRichiestaRequestDto to RetrieveRichiestaRequest
        RetrieveRichiesta RetrieveRichiesta = new RetrieveRichiesta();

        RetrieveRichiesta.setAgenzia(result.getAgenzia());

        RetrieveRichiesta.setAllegato(result.getAllegatoDTO());

        RetrieveRichiestaResponse response = new RetrieveRichiestaResponse();
        LOGGER.info("Risposta" + response.toString());

        response.setRetrieveRichiesta(RetrieveRichiesta);

        return response;
    }  

Когда я отправляю запрос через SOAP, я получаю в ответ эту ошибку

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring xml:lang="en">Error while extracting response for type [class eu.ima.app.domain.RetrieveRichiestaDto] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `eu.ima.app.domain.RetrieveRichiestaDto` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `eu.ima.app.domain.RetrieveRichiestaDto` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Я думаю, потому что он хочет JSON Объект, подобный этому {} и не так [{}]

я также пытался изменить код, подобный этому

......
HttpEntity<?> entity = new HttpEntity<>(input,headers);

        ResponseEntity<List<RetrieveRichiestaResponseDto>> result = restTemplate.exchange(
                uri,
                HttpMethod.POST,
                entity,
                new ParameterizedTypeReference<List<RetrieveRichiestaResponseDto>>() {});
        List<RetrieveRichiestaResponseDto> rates = result.getBody();
        //LOGGER.info(rates.toString());

        for (int i = 0; i < rates.size(); i++) {
            System.out.println(rates.get(i));
        }
......

, чтобы получить его в виде списка, но как тогда передать его в RetrieveRichiesta в виде списка? Где ошибка? Это много за любую помощь !!

1 Ответ

0 голосов
/ 16 апреля 2020

Хорошо, я мог бы получить доступ к списку с помощью

rates.get(0).getAgenzia
Etc.

, но если бы я хотел использовать restTemplate.postForObject, как это

ResponseEntity<List<RetrieveRichiestaResponseDto>> result = restTemplate.postForObject(
                uri,
                entity,
                new ParameterizedTypeReference<List<RetrieveRichiestaResponseDto>>() {});

почему это дает мне

the method is not applicable for the arguments....

Нужна помощь по этому вопросу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...