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) ?

33
demandé sur Passionate Developer 2015-03-03 03:02:11

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);
41
répondu Mark Peters 2015-03-03 00:22:08

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.

15
répondu user2578871 2018-09-17 16:40:27

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;
}
13
répondu Himadri Pant 2017-09-15 06:52:29

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));
2
répondu nurb 2016-07-08 10:02:23