Получение исключения CsvBeanIntrospectionException при использовании OpenCSV

Я пытаюсь написать CSV с помощью openCSV 4.1 из списка beans. Однако всякий раз, когда я запускаю свою программу, я получаю исключение CsvBeanIntrospectionException, а затем исключение NoSuchMethodException: Unknown property 'fieldx' в классе 'class TestObject'

Я успешно использовал читателя, чтобы прочитать CSV-файл со списком bean-компонентов.

Вот мой код для объекта TestObject:

import com.opencsv.bean.CsvBindByName;
import java.io.Serializable;

public class TestObject implements Serializable {
    @CsvBindByName
    int fieldx;
    @CsvBindByName
    int fieldy;
    public TestObject() {
    }
    public TestObject(int x, int y) {
        this.fieldx = x;
        this.fieldy = y;
    }

    public int getX() {
        return fieldx;
    }
    public int getY() {
        return fieldy;
    }
    public void setX(int x) {
        this.fieldx = x;
    }
    public void setY(int y) {
        this.fieldy = y;
    }
    @Override
    public String toString(){
        return "{" + fieldx + "," + fieldy + "}";
    }
}

А вот и все остальное.

  public class Project {
    public static void main(String[] args) {
        TestObject t1 = new TestObject(1,2);
        TestObject t2 = new TestObject(3,4);

        List<TestObject> testList = new ArrayList<>();
        testList.add(t1);
        testList.add(t2);

        Prep prep = new Prep();
        try {
            prep.writeCSV(testList);
        } catch (IOException | CsvDataTypeMismatchException | CsvRequiredFieldEmptyException ex) {
            ex.printStackTrace();
        }
    }
}

import com.opencsv.bean.*;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;

public class Prep {
    public void writeCSV(List<TestObject> t) throws IOException, 
            CsvDataTypeMismatchException,
            CsvRequiredFieldEmptyException {
        Writer writer = new FileWriter("testfile.csv");
     StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
     beanToCsv.write(t);
     writer.close();        
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
3 019
4

Ответы 4

Путем исключения я обнаружил, что имена методов получения должны совпадать с именами свойств. С исправлением ниже теперь я могу писать в CSV из списка объектов.

//...
    public int getFieldx() {
        return fieldx;
    }
    public int getFieldy() {
        return fieldy;
    }
    public void setFieldx(int x) {
        this.fieldx = x;
    }
    public void setFieldy(int y) {
        this.fieldy = y;
    }
//...

Ух ты. Это было неожиданно. Практически каждая библиотека парсера / сериализации, которую я когда-либо использовал, либо (а) не требует геттеров / сеттеров, либо (б) имеет аннотации непосредственно к методам доступа ...

Qw3ry 18.11.2019 11:03

В моем случае конструктор не был объявлен публичным!

У меня была аналогичная ошибка, попробуйте добавить конструктор по умолчанию для класса, в который вы хотите преобразовать CSV, у меня это сработало.

Мой случай был связан с тем, что я тестировал библиотеку, поэтому я создал непубличный файл bean-компонента, который был проблемой, поэтому убедитесь, что файл bean-компонента является файлом общедоступного класса, поскольку библиотека использует CGLIB, который проксирует класс, поэтому ему необходимо получить к нему доступ

Другие вопросы по теме