Podczas dekodowania strumień JAVA do Java , otrzymuję poniżej wyjątek:

2019-02-25 13:44:39.136 TRACE [{}] 25292 --- [reactor-http-nio-4] o.s.w.r.f.c.ExchangeFunctions            : [762021a9] Response 200 OK, headers={masked}
2019-02-25 13:44:39.195 ERROR [{}] 25292 --- [reactor-http-nio-4] r.M.C.2                                  : | onError(org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character ('[' (code 91)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('[' (code 91)): was expecting double-quote to start field name
 at [Source: UNKNOWN; line: 2, column: 3])
2019-02-25 13:44:39.196 ERROR [{}] 25292 --- [reactor-http-nio-4] r.M.C.2                                  : 
org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character ('[' (code 91)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('[' (code 91)): was expecting double-quote to start field name
 at [Source: UNKNOWN; line: 2, column: 3]
    at org.springframework.http.codec.json.Jackson2Tokenizer.tokenize(Jackson2Tokenizer.java:104) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]

Ustawianie właściwości Codec Mappera w następujący sposób nie rozwiązuje problemu:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

Gdzie działa JSON :

[
  {
    "id": "111",
    "description": "xyz"
  },
  {
    "id": "222",
    "description": "pqr"
  }
]

Tutaj wdrożenie WebClient:

public Mono<List<ItemServiceResponse>> getItems(ItemServiceRequest itemServiceRequest) {
return webClient
        .post()
        .contentType(MediaType.APPLICATION_JSON)
        .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_STREAM_JSON.toString())
        .body(Mono.just(itemServiceRequest), ItemServiceRequest.class)
        .retrieve()
        .bodyToFlux(ItemServiceResponse.class)
        .collectList()
        .log();
}

Oto obiekt Java:

@Builder 
@Data 
@AllArgsConstructor 
@NoArgsConstructor 
public class ItemServiceResponse { 
  private String id; 
  private String description; 
}
0
Ravi Mishra 25 luty 2019, 12:36

2 odpowiedzi

Najlepsza odpowiedź

Straszny problem !!! Zmarnowałem moje 4-5 dni wymyślać, co jest nie tak w moim kodzie i próbowałem wszystkie kombinacji permutacji, ale nic nie działało.

Ale chłopaki, listonosz był winem, tak, to prawda.

Rzeczywista struktura odpowiedzi JSON, którą otrzymałem:

{
  [
    {
      "id": "111",
      "description": "xyz"
    },
    {
      "id": "222",
      "description": "pqr"
    }
  ]
}

I to jest zniekształcony JSON. Ale Listonosz był w jakiś sposób autocorrecting i dał prawidłową odpowiedź jako JSON o wymienionych w pytaniu i nie patrzyłem więcej na odpowiedź, ponieważ kod statusu przychodziło jako 200 sukcesów.

Na szczęście wyzwalam polecenie Curl i otrzymałem przyczynę główną. Proszę, nie wierz, że listonosz ... Jest cholernie inteligentny, aby poprawić rzeczy, które nie są wymagane.

1
Ravi Mishra 26 luty 2019, 08:32

ObjectMapper spodziewa się, że pojedynczy obiekt zostanie zmapowany z JSON repsonse jako ItemServiceResponse Dlatego wyjątek (Mapper oczekuje, że cytat ) .

Powinieneś zaktualizować wywołanie WebClient, aby mapować array ItemServiceResponse:

public Mono<List<ItemServiceResponse>> getItems(ItemServiceRequest itemServiceRequest) {
    return webClient
            .post()
            .contentType(MediaType.APPLICATION_JSON)
            .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_STREAM_JSON.toString())
            .body(Mono.just(itemServiceRequest), ItemServiceRequest.class)
            .retrieve()
            .bodyToFlux(ItemServiceResponse[].class) // <-- array of ItemServiceResponse
            .collectList()
            .log();
}
0
tmarwen 25 luty 2019, 09:58