改造:用杰克逊反序列化失败,没有任何错误
Posted
技术标签:
【中文标题】改造:用杰克逊反序列化失败,没有任何错误【英文标题】:Retrofit: deserialization with jackson fails without any error 【发布时间】:2018-04-14 04:15:28 【问题描述】:我有以下用于调用 Rest-API 的代码:服务
Retrofit client = Client.getClient();
Call<ResponseBeanOutput<UserBeanOutput>> call = client.create(AuthResource.class).login("username","password","true");
Response<ResponseBeanOutput<UserBeanOutput>> response = call.execute();
通过静态方法获取客户端:
public static Retrofit getClient()
ObjectMapper mapper = new ObjectMapper();
return new Retrofit.Builder()
.baseUrl(getBaseUrl())
.addConverterFactory(JacksonConverterFactory.create(mapper))
.build();
服务器以 JSON 格式发送响应,如下所示:
"error": false,
"message": "Successfull login",
"errorCode": 0,
"data":
"uid": 7,
"email": "user@example.com",
"name": "username",
"nick": "usernick",
"photoUrl": "media/profiles/defaultImageProfile.png",
"lts": "aaaaeqc9lf9od82rk633aaaaa"
我必须将此响应映射到包含 UserBeanOutput 类型的字段(数据)的通用对象 ResponseBeanOutput(映射 json 对象中的对象“数据”)。所以最后 ResponseBeanOutput 将映射字段“error”、“message”、“errorCode”,数据将是“UserBeanOutput”类型的对象,包含“uid”、“email”、“nick”等。
我的问题是所有对象都是空的(null),我没有错误。
我还尝试从 ResponseBeanOutput 中删除泛型类型,并使用带有“错误”和“消息”字段的简单 bean 映射响应,并使用 releted getter 和 setter 但没有任何成功。
我做错了什么?
【问题讨论】:
你尝试调试改造吗?在大多数情况下,它对我有用,当我不明白为什么 3-rd 方库不能按我预期的那样工作时。只需在 .execute() 方法的开头下一个断点,一步一步找到原因。 【参考方案1】:我按照@Yevhenii Semenov 的建议解决了问题,调试了 execute() 方法。我发现问题出在没有在响应中返回正文的 API 中,因此反序列化为空。 初始化客户端的代码很好。
谢谢
【讨论】:
以上是关于改造:用杰克逊反序列化失败,没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章