development

java.lang.ClassCastException : java.util.LinkedHashMap을 com.testing.models.Account로 캐스트 할 수 없습니다.

big-blog 2020. 12. 11. 19:07
반응형

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)있습니까?


문제는 잭슨에서 나왔습니다. 역 직렬화 할 클래스에 대한 정보가 충분하지 않으면 LinkedHashMap.

당신이 당신의 요소 유형의 잭슨을 통보하지 않을 때문에 ArrayList, 그것은 당신이로 직렬화하는 것을 모르는 ArrayListAccount의. 따라서 기본값으로 돌아갑니다.

대신을 사용 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.convertValue(
    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 변환 을 참조하십시오.


LinkedHashMap 개체의 수집 문제에 대한 JSON 배열을 완화 할 수있는 방법 CollectionTypeTypeReference. 이것이 내가하고 일한 것입니다 .

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여전히 LinkedHashMaps의 ArrayList를 얻었습니다. 즉 작동하지 않습니다 .

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)

두 번째 줄에 오류가 발생하면 One 사용할 수 있습니다.

List<Document> docs = obj.get("documents");
Document doc = new Document(docs.get(0));

XML을 역 직렬화하고 형식을 변환하는이 메서드가 있습니다.

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 );   
}

그리고 이것은 부름입니다 :

List<POJO> pojos = (List<POJO>) MyUtilClass.deserialize(xml, ArrayList.class,new TypeReference< List< POJO >>(){ });

참고 URL : https://stackoverflow.com/questions/28821715/java-lang-classcastexception-java-util-linkedhashmap-cannot-be-cast-to-com-test

반응형