环境:springboot 2.3.6
问题概述:通过构造 TypeReference 实现泛型反序列化,但实际上序列化出来的并不是想要的实际类型。并且,只有在于线上的某个节点出现,且本地无法复现。
简化业务逻辑代码:
@Setter
@Getter
@ToString
public static class BaseResponse {
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 List doGet4List(Class 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> baseResponse = JSON.parseObject(body, new TypeReference(responseCls) {
});
return Optional.ofNullable(baseResponse).map(BaseResponse::getData).orElse(null);
}
}
问题报错代码
@Test
public void testFastJsonParse() {
List 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......
private, Static, class, countryresponse