Невозможно перебрать массив, содержащий связанный hashmap

Я пытаюсь перебрать экземпляр ArrayList класса Object с использованием цикла for:

for(PayloadDTO payloadDTO:payloadDTOList) {
    if(payloadDTO.getEntType().equals(CommonConstants.CUSTOMENTTYPEROLEID.RES_ROLE_TYPE)) {
        resRoleNameList.add(payloadDTO.getEntName());
    } 
}

https://stackru.com/images/b67d09d3a30ca47f622aa29df5cb1bde bc5227e1.png

Это дает мне следующую ошибку:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.alnt.fabric.external.model.PayloadDTO
    at com.alnt.fabric.external.rbac.service.ExternalFabricService.loadImpactedUserCount(ExternalFabricService.java:384)
    at com.alnt.fabric.external.rbac.controller.ExternalFabricController.loadImpactedUserCount(ExternalFabricController.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

Поэтому я попытался преобразовать его, используя код ниже:

payloadDTOList = convert(payloadDTOList.toString(), List<PayloadDTO.class>);


    public static <T> T convert(String json, Class<T> type) throws ALNTApplicationException {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.readValue(json, type);
    } catch (Exception e) {
        throw new ALNTApplicationException(FabricComponentErrorCodes.ACTION_HANDLER_ERROR_CODE,"Object conversion error");
    }
}

4 ответа

Решение

Попробуй за петлю с кастингом

for (int i=0; i < payloadDTOList.size(); i++) {
    PayloadDTO payloadDTO = (PayloadDTO) payloadDTOList.get(i);       
    if(payloadDTO.getEntType().equals(CommonConstants.CUSTOMENTTYPEROLEID.RES_ROLE_TYPE)) {
      resRoleNameList.add(payloadDTO.getEntName());
    }
}

Вы можете выполнить итерацию ArrayList и создать на его основе новый список объектов. Затем вы можете выполнить итерацию payloadDTOList2 с помощью forEach.

      List<PayloadDTO> payloadDTOList2 = new ArrayList<>();
for (int i=0; i < payloadDTOList.size(); i++) {
   LinkedHashMap<String,String> linkedHash = (LinkedHashMap<String, String>) payloadDTOList.get(i);
   PayloadDTO payloadDTO =  new PayloadDTO();
   payloadDTO.setEntType(linkedHash.get("EntType"));
   payloadDTO.setEntName(linkedHash.get("EntName"));
   payloadDTOList2.add(payloadDTO);
}

Для преобразования массива JSON в коллекцию используйте это:

payloadDTOList = 
    convert(
        payloadDTOList.toString(),
        TypeFactory.defaultInstance().constructCollectionType( 
            List.class , 
            PayloadDTO.class
        )
    );

и измените метод на:

public static <T> T convert(String json, JavaType type) throws ALNTApplicationException {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.readValue(json, type);
    } catch (Exception e) {
        throw new ALNTApplicationException(FabricComponentErrorCodes.ACTION_HANDLER_ERROR_CODE,"Object conversion error");
    }
}


public static <T> T convert(String json, Class<T> type) throws ALNTApplicationException {
    return convert( 
            json , 
            TypeFactory.defaultInstance().constructType( 
                    type 
            ) 
    );
}

Как мы видим на снимке, список payloadDTOList имеет тип LinkedHashMap и вы пытаетесь назначить его в PayloadDTO в for(PayloadDTO payloadDTO:payloadDTOList),

Если вы уверены, что все объекты в списке payloadDTOList имеет тип LinkedHashMap чем использовать, как: for(LinkedHashMap map:payloadDTOList)

Если вы не уверены в типе объектов в списке, используйте обычный цикл.

for (int i=0; i < payloadDTOList.size(); i++) {
    if(payloadDTOList.get(i) instanceof PayloadDTO)
         PayloadDTO payloadDTO = (PayloadDTO) payloadDTOList.get(i);
    }
}
Другие вопросы по тегам