org.springframework.core.codec.DecodingException: Erro de decodificação JSON: caractere ilegal ((CTRL-CHAR, código 31))

Aug 26 2020

Estou recebendo o seguinte erro ao obter uma resposta de um método de postagem via WebClient (org.springframework.web.reactive.function.client)

org.springframework.core.codec.DecodingException: JSON decoding error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens; nested exception is com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 2]
at org.springframework.http.codec.json.AbstractJackson2Decoder.processException(AbstractJackson2Decoder.java:215)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Ȁ

Tentei alterar os cabeçalhos da solicitação como em com falha : -

headers.put("Accept-Encoding", "gzip");

ou

headers.put("Accept-Encoding", "identity");

Será que o webclient não consegue processar a resposta gzip por algum motivo !!

Desde já, obrigado!!

Respostas

1 Nilotpal Aug 28 2020 at 02:48

Perdi a implementação de Serializable para o objeto de resposta.

PrasanthRajendran Nov 12 2020 at 13:53

Comecei a receber essa exceção com a dependência de simulação do Spring boot spring-cloud-openfeign-corequando atualizo a versão do spring-cloud-openfeign-corepara 2.2.5.RELEASE.

Para quem atualizar para a versão 2.2.5.RELEASE ou versão posterior, vai enfrentar esse problema se já tiver a propriedade feign.request.compression=true.

A razão técnica por trás disso é que, na FeignContentGzipEncodingAutoConfigurationclasse, a assinatura da anotação da propriedade condicional mudou de @ConditionalOnProperty("feign.compression.request.enabled", matchIfMissing = false)para @ConditionalOnProperty(value = "feign.compression.request.enabled"), então, por padrão, FeignContentGzipEncodingInterceptoré disparada. Referência do GitHub

Gambiarra

Se você está chamando um serviço de inicialização rápida que não tem um mecanismo para lidar com o compressed request, desative a compressão de solicitação de simulação usando a propriedade abaixo

feign.request.compression=false.

NOTA : Infelizmente, nós ainda não temos a solução out-of-box na primavera-boot para manipular a solicitação comprimido referem