Java.lang.ClassCastException: java.util.LinkedHashMap ne peut pas être diffusé sur com.test.modèle.Compte
j'obtiens en dessous de l'erreur:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account
avec le code ci-dessous
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);
y a-t-il une raison pour laquelle je ne peux pas faire get(0)
?
4 réponses
le numéro vient de Jackson. Quand il n'a pas assez d'informations sur la classe de désérialiser, il utilise des LinkedHashMap
.
puisque vous n'informez pas Jackson du type d'élément de votre ArrayList
, il ne sait pas que vous voulez desérialiser dans un ArrayList
de Account
S. Donc, il revient à la valeur par défaut.
au lieu de cela, vous pourriez probablement utiliser as(JsonNode.class)
, et puis traiter avec le ObjectMapper
dans un plus riche que reste-assuré le permet. Quelque chose comme ceci:
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);
essayez ce qui suit:
POJO pojo = mapper.convertValue(singleObject, POJO.class);
ou:
List<POJO> pojos = mapper.convertValue(
listOfObjects,
new TypeReference<List<POJO>>() { });
Voir conversion de LinkedHashMap pour plus d'informations.
la façon dont je pouvais atténuer le problème JSON tableau à la collection D'objets LinkedHashMap était en utilisant CollectionType
plutôt que TypeReference
.
C'est ce que j'ai fait et travaillé :
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;
}
en utilisant le TypeReference
, j'obtenais encore un tableau de LinkedHashMaps, i.e. ne fonctionne pas :
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;
}
j'ai eu une exception similaire (mais problème différent) - java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.bson.Document
, et heureusement il est résolu plus facile:
au lieu de
List<Document> docs = obj.get("documents");
Document doc = docs.get(0)
qui donne l'erreur sur la deuxième ligne, On peut utiliser
List<Document> docs = obj.get("documents");
Document doc = new Document(docs.get(0));