org.springframework.core.codec.DecodingException: Lỗi giải mã JSON: Ký tự không hợp lệ ((CTRL-CHAR, mã 31))
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
Tôi đã bỏ lỡ việc triển khai Serializable cho đối tượng phản hồi.
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 địnhFeignContentGzipEncodingInterceptorđượ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