版本:fastjson 1.2.76
环境:springboot 2.3.6
问题概述:通过构造 TypeReference 实现泛型反序列化,但实际上序列化出来的并不是想要的实际类型。并且,只有在于线上的某个节点出现,且本地无法复现。
简化业务逻辑代码:
BaseResponse<T>
装载通用的接口响应,其属性 private T data
是不同类型的数据;CountryResponse
通过 json 数据反序列出:BaseResponse<CountryResponse>
HttpRequestUtil
,有个 static 方法将接口的 response body 反序列出 BaseResponse<T>
@Setter
@Getter
@ToString
public static class BaseResponse<T> {
private Integer code;
private String msg;
private T data;
}
@Setter
@Getter
@ToString
public static class CountryResponse {
private String countryId;
private String countryName;
}
public static class HttpRequestUtil {
public static <T> List<T> doGet4List(Class<T> responseCls) {
// 工具类方法,body 变量模拟了请求响应 {"code":0,"success":true,"msg":"success","data":[{"countryId":"CN","countryName":"China"}]}
String body = "{\"code\":0,\"success\":true,\"msg\":\"success\",\"data\":[{\"countryId\":\"CN\",\"countryName\":\"China\"}]}";
log.info("doGet4List result: [{}]", body);
BaseResponse<List<T>> baseResponse = JSON.parseObject(body, new TypeReference<>(responseCls) {
});
return Optional.ofNullable(baseResponse).map(BaseResponse::getData).orElse(null);
}
}
问题报错代码
@Test
public void testFastJsonParse() {
List<CountryResponse> countryResponses = HttpRequestUtil.doGet4List(CountryResponse.class);
for (CountryResponse countryResponse : countryResponses) { // 这行报错了
System.out.println(countryResponse.getCountryId());
}
}
查看线上日志,报错行数是:for (CountryResponse countryResponse : countryResponses) {
这一行。
java.lang.ClassCastException: class com.alibaba.fastjson.JSONObject cannot be cast to class com.foo.entity.CountryResponse(com.alibaba.fastjson.JSONObject and com.foo.entity.CountryResponse are in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @2a2d45ba)
猜测:countryResponses 这个 List 的元素实际上是 JSONObject 对象,遍历时候强转了一次。
主要是线上的所有节点都是同样的镜像,只有某个节点会出这个错误,本地无法复现,拿相同的 json 数据去反序列,都能正确反序列出 CountryResponse 。这个工具类方法都跑了大半年了。。。
自我怀疑人生 ing......
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.