【异常】Feign默认的JSON解码器试图将SSE格式的响应解析为JSON对象,导致解析失败。JSON parse error: Unrecognized token ‘data‘: was expe

一、报错内容

07-17 12:30:04.647 ERROR [http-nio-8080-exec-1] o.a.c.
### 解决方案 在Spring Boot应用中遇到`HttpMessageNotReadableException`错误通常是由于Jackson库无法正确反序列化JSON数据引起的。以下是可能的原因以及解决方案: #### 原因分析 1. **字段不匹配**:如果JSON中的字段名与目标类`Status`的属性名称不一致,则会引发反序列化失败[^2]。 2. **类型不兼容**:JSON结构中的某些节点可能是数组或对象,但目标类期望的是字符串或其他基本类型[^1]。 3. **枚举处理不当**:当JSON尝试映射到Java枚举类型时,如果没有提供合适的转换逻辑,也会抛出类似的异常。 4. **日期格式问题**:对于`Date`类型的字段,若未指定正确的日期时间格式,也可能导致解析失败[^3]。 #### 解决方法 为了有效解决问题,可以采取以下措施之一或多者组合来修正此行为: ##### 方法一:调整实体类定义 确保`Status`类及其父级关联的对象都已正确定义了所有必要的getter/setter方法,并且其成员变量的名字要严格对应于传入JSON里的键值对。另外还可以利用注解如`@JsonProperty("jsonKey")`手动指明如何映射不同的命名约定。 ```java public class Status { private String name; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private Date createdAt; // Getters & Setters omitted for brevity. } ``` ##### 方法二:全局配置ObjectMapper 通过自定义`ObjectMapper`实例并将其注入至整个应用程序上下文中,从而统一管理所有的序列化/反序列化进程。这样做的好处是可以集中设置一些通用规则,像忽略未知属性、支持宽松模式等特性[^5]。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } } ``` ##### 方法三:局部覆盖默认行为 针对特定场景下的特殊需求,可以通过重写Feign客户端的行为或者拦截器的方式,在请求前预处理参数;又或者是捕获异常后重新构建响应体再交由业务层继续执行下去[^5]。 ```java @Component public class FeignErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { try { String body = Util.toString(response.body().asReader()); Result<?> result = JSON.parseObject(body, Result.class); throw new BizException(result.getCode(), result.getMsg()); } catch (IOException e) { log.error(e.getMessage(), e); return new RuntimeException("Failed to process request."); } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本本本添哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值