restassured - java.lang.ClassCastException: java.util.LinkedHashMap no se puede enviar a com.testing.models.Account
restassured maven example (5)
Me aparece el siguiente error:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account
con el siguiente código
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);
¿Hay alguna razón por la que no puedo
get(0)
?
El problema viene de Jackson.
Cuando no tiene suficiente información sobre qué clase deserializar, utiliza
LinkedHashMap
.
Dado que no está informando a Jackson sobre el tipo de elemento de su
ArrayList
, no sabe que desea deserializarse en una
ArrayList
of
Account
s.
Entonces vuelve a los valores predeterminados.
En cambio, probablemente podría usar
as(JsonNode.class)
, y luego tratar con
ObjectMapper
de una manera más rica de lo que permite estar seguro.
Algo como esto:
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);
Intenta lo siguiente:
POJO pojo = mapper.convertValue(singleObject, POJO.class);
o:
List<POJO> pojos = mapper.convertValue(
listOfObjects,
new TypeReference<List<POJO>>() { });
Consulte la conversión de LinkedHashMap para obtener más información.
La forma en que pude mitigar el problema de la
matriz JSON para la colección de objetos LinkedHashMap
fue mediante el uso de
CollectionType
lugar de
TypeReference
.
Esto es lo que hice y
trabajé
:
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;
}
Usando
TypeReference
, todavía
TypeReference
una ArrayList de LinkedHashMaps, es decir
, no funciona
:
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;
}
Tengo este método para deserializar un XML y convertir el tipo:
public <T> Object deserialize(String xml, Class objClass ,TypeReference<T> typeReference ) throws IOException {
XmlMapper xmlMapper = new XmlMapper();
Object obj = xmlMapper.readValue(xml,objClass);
return xmlMapper.convertValue(obj,typeReference );
}
y esta es la llamada:
List<POJO> pojos = (List<POJO>) MyUtilClass.deserialize(xml, ArrayList.class,new TypeReference< List< POJO >>(){ });
Tuve una excepción similar (pero un problema diferente):
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.bson.Document
, y afortunadamente se resuelve más fácilmente:
En lugar de
List<Document> docs = obj.get("documents");
Document doc = docs.get(0)
que da error en la segunda línea, se puede usar
List<Document> docs = obj.get("documents");
Document doc = new Document(docs.get(0));