org.springframework.core.codec.DecodingException: errore di decodifica JSON: carattere non valido ((CTRL-CHAR, codice 31))
Ricevo il seguente errore ottenendo una risposta di un metodo di pubblicazione tramite 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: Ȁ
Ho provato a cambiare le intestazioni della richiesta come sotto con errore : -
headers.put("Accept-Encoding", "gzip");
o
headers.put("Accept-Encoding", "identity");
È che webclient non è in grado di elaborare la risposta compressa con gzip per qualsiasi motivo !!
Grazie in anticipo!!
Risposte
Ho perso l'implementazione di Serializable nell'oggetto risposta.
Ho iniziato a ricevere questa eccezione con la finta dipendenza di Spring Boot spring-cloud-openfeign-corequando aggiorno la versione di spring-cloud-openfeign-corea 2.2.5.RELEASE.
Per coloro che eseguono l'aggiornamento alla versione 2.2.5.RELEASE o versione successiva dovrà affrontare questo problema se ne hanno già la proprietà feign.request.compression=true.
La ragione tecnica alla base di ciò è che nella
FeignContentGzipEncodingAutoConfigurationclasse la firma dell'annotazione della proprietà condizionale è cambiata da@ConditionalOnProperty("feign.compression.request.enabled", matchIfMissing = false)a@ConditionalOnProperty(value = "feign.compression.request.enabled"), quindi per impostazione predefinitaFeignContentGzipEncodingInterceptorviene attivata. Riferimento a GitHub
Soluzione
Se stai chiamando un servizio di avvio a molla che non ha un meccanismo per gestire il, compressed requestdisabilita la compressione della richiesta falsa usando la proprietà sottostante
feign.request.compression=false.
NOTA : Sfortunatamente, non abbiamo ancora la soluzione pronta all'uso in spring-boot per gestire il riferimento della richiesta compressa