Почему я получаю сообщение об ошибке «Невозможно установить для поля int значение hashmap» при использовании get с отражением java? - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь экспортировать некоторые объекты Java в электронную таблицу Excel, используя Apache POI и отражение Java.Я реализовал класс ExcelWriter, который принимает список объектов типа T и сохраняет их значения в электронной таблице.Он работал с несколькими различными типами, но я получаю это сообщение об ошибке «не могу установить для поля int hashmap», которое указывает на метод get, и я никогда не использовал метод set в этом классе.

Вот код для этого класса.

class ExcelWriter<T>{

    private List<T> objList;

    private Field[] fields;

    private Class<T> objClass;

    public ExcelWriter(List<T> objList, Class<T> typeParam) {
        this.objList = objList;
        this.objClass = typeParam;
        this.fields = objClass.getDeclaredFields();
    }

    public void writeXlsToOutputStream(OutputStream responseOutputStream) throws Exception {
        //some code
        fields[i].setAccessible(true);
        row.createCell(i).setCellValue(fields[i].get(obj).toString()); // the error msg points to this line
        //some code
    }

}

Ниже приведен класс объекта данных, который я пытаюсь экспортировать:

//I am also using lombok and mybatis in this class, hence the annotations
@Data
@TableName("bad_detail")
class BadDetailDO{
    @TableId
    private int id;
    //more private fields
}

и сообщение об ошибке:

java.lang.IllegalArgumentException: Can not set int field com.csdt.mi.data.ifir.domain.BadDetailDO.id to java.util.HashMap
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
    at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
    at java.base/java.lang.reflect.Field.get(Field.java:418)
    at com.csdt.mi.quality.utils.ExcelWriter.writeXlsToOutputStream(ExcelWriter.java:64)
    ...

Есть идеи, что вызвало это?

1 Ответ

0 голосов
/ 05 июля 2019

Оказывается, это проблема конфигурации mybatis, когда я установил тип результата BadDetailDO в качестве «карты» в Mapper.xml, в результате чего mybatis вернул результаты запроса в HashMap.Я изменил тип результата на полное имя BadDetailDO, и проблема исчезла.

...