org.springframework.core.codec.DecodingException: Lỗi giải mã JSON: Ký tự không hợp lệ ((CTRL-CHAR, mã 31))

Aug 26 2020

Tôi gặp lỗi sau khi nhận được phản hồi của một phương thức đăng qua WebClient (org.springframework.web.reactive. Chức năng.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: Ȁ

Tôi đã thử thay đổi tiêu đề của yêu cầu như dưới đây nhưng không thành công : -

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

hoặc là

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

Có phải webclient không thể xử lý phản hồi được nén vì bất kỳ lý do gì không !!

Cảm ơn trước!!

Trả lời

1 Nilotpal Aug 28 2020 at 02:48

Tôi đã bỏ lỡ việc triển khai Serializable cho đối tượng phản hồi.

PrasanthRajendran Nov 12 2020 at 13:53

Tôi đã bắt đầu nhận được ngoại lệ này với sự phụ thuộc giả định của Spring boot spring-cloud-openfeign-corekhi tôi nâng cấp phiên bản của spring-cloud-openfeign-corelên 2.2.5.RELEASE.

Đối với những người nâng cấp lên phiên bản 2.2.5.RELEASE hoặc phiên bản mới hơn sẽ phải đối mặt với vấn đề này nếu họ đã có thuộc tính feign.request.compression=true.

Lý do kỹ thuật đằng sau điều này là, trong FeignContentGzipEncodingAutoConfigurationlớp, chữ ký chú thích thuộc tính có điều kiện được thay đổi từ @ConditionalOnProperty("feign.compression.request.enabled", matchIfMissing = false)thành @ConditionalOnProperty(value = "feign.compression.request.enabled"), do đó, theo mặc định FeignContentGzipEncodingInterceptorđược kích hoạt. Tham khảo GitHub

Cách giải quyết

Nếu bạn đang gọi một dịch vụ khởi động mùa xuân không có cơ chế xử lý compressed requestthì hãy tắt tính năng nén yêu cầu giả bằng cách sử dụng thuộc tính dưới đây

feign.request.compression=false.

LƯU Ý : Rất tiếc, chúng tôi vẫn chưa có giải pháp out-of-box trong spring-boot để xử lý yêu cầu nén tham khảo