java.lang.ClassCastException: java.util.LinkedHashMap 无法转换为 com.testing.models.Account

新手上路,请多包涵

我遇到以下错误:

 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account

使用以下代码

final int expectedId = 1;

Test newTest = create();

int expectedResponseCode = Response.SC_OK;

ArrayList<Account> account = given().when().expect().statusCode(expectedResponseCode)
    .get("accounts/" + newTest.id() + "/users")
    .as(ArrayList.class);
assertThat(account.get(0).getId()).isEqualTo(expectedId);

我不能做 get(0) 有什么原因吗?

原文由 Passionate Engineer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

问题来自杰克逊。当它没有关于反序列化到哪个类的足够信息时,它使用 LinkedHashMap

由于您没有告知 Jackson 您的 ArrayList 的元素类型,它不知道您要反序列化为 ArrayListAccount s所以它回落到默认值。

相反,您可能会使用 as(JsonNode.class) ,然后以比 rest-assured 允许的更丰富的方式处理 ObjectMapper 。是这样的:

 ObjectMapper mapper = new ObjectMapper();

JsonNode accounts = given().when().expect().statusCode(expectedResponseCode)
    .get("accounts/" + newClub.getOwner().getCustId() + "/clubs")
    .as(JsonNode.class);

//Jackson's use of generics here are completely unsafe, but that's another issue
List<Account> accountList = mapper.convertValue(
    accounts,
    new TypeReference<List<Account>>(){}
);

assertThat(accountList.get(0).getId()).isEqualTo(expectedId);

原文由 Mark Peters 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试以下操作:

 POJO pojo = mapper.convertValue(singleObject, POJO.class);

或者:

 List<POJO> pojos = mapper.convertValue(
    listOfObjects,
    new TypeReference<List<POJO>>() { });

有关详细信息,请参阅 LinkedHashMap 的转换

原文由 user2578871 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题