Ява.ленг.ClassCastException: java.утиль.LinkedHashMap нельзя привести к com.тестирование.модели.Счет
Я получаю ниже ошибки:
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)
?
4 ответов
проблема исходит от Джексона. Когда у него недостаточно информации о том, какой класс десериализовать, он использует LinkedHashMap
.
поскольку вы не информируете Джексона о типе элемента вашего ArrayList
, он не знает, что вы хотите, чтобы десериализовать в ArrayList
of Account
s. Таким образом, он возвращается к умолчанию.
вместо этого, вы могли бы использовать as(JsonNode.class)
, а затем разобраться с 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.readValue(
mapper.treeAsTokens(accounts),
new TypeReference<List<Account>>(){}
);
assertThat(accountList.get(0).getId()).isEqualTo(expectedId);
попробуйте следующее:
POJO pojo = mapper.convertValue(singleObject, POJO.class);
или:
List<POJO> pojos = mapper.convertValue(
listOfObjects,
new TypeReference<List<POJO>>() { });
посмотреть преобразование LinkedHashMap для получения дополнительной информации.
как я мог бы смягчить массив JSON для коллекции объектов LinkedHashMap проблема заключалась в использовании CollectionType
, а не TypeReference
.
Вот что я сделал и работала:
public <T> List<T> jsonArrayToObjectList(String json, Class<T> tClass) throws IOException {
ObjectMapper mapper = new ObjectMapper();
CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass);
List<T> ts = mapper.readValue(json, listType);
LOGGER.debug("class name: {}", ts.get(0).getClass().getName());
return ts;
}
С помощью TypeReference
, Я все еще получал ArrayList LinkedHashMaps, т. е. не работает:
public <T> List<T> jsonArrayToObjectList(String json, Class<T> tClass) throws IOException {
ObjectMapper mapper = new ObjectMapper();
List<T> ts = mapper.readValue(json, new TypeReference<List<T>>(){});
LOGGER.debug("class name: {}", ts.get(0).getClass().getName());
return ts;
}
у меня было аналогичное исключение (но другая проблема) -java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.bson.Document
, и к счастью это решается проще:
вместо
List<Document> docs = obj.get("documents");
Document doc = docs.get(0)
что дает ошибку на второй строке, можно использовать
List<Document> docs = obj.get("documents");
Document doc = new Document(docs.get(0));