org.springframework.core.codec.DecodingException: Erro de decodificação JSON: caractere ilegal ((CTRL-CHAR, código 31))
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
Perdi a implementação de Serializable para o objeto de resposta.
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