Я пытаюсь написать 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();
}
}




Путем исключения я обнаружил, что имена методов получения должны совпадать с именами свойств. С исправлением ниже теперь я могу писать в 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;
}
//...
В моем случае конструктор не был объявлен публичным!
У меня была аналогичная ошибка, попробуйте добавить конструктор по умолчанию для класса, в который вы хотите преобразовать CSV, у меня это сработало.
Мой случай был связан с тем, что я тестировал библиотеку, поэтому я создал непубличный файл bean-компонента, который был проблемой, поэтому убедитесь, что файл bean-компонента является файлом общедоступного класса, поскольку библиотека использует CGLIB, который проксирует класс, поэтому ему необходимо получить к нему доступ
Ух ты. Это было неожиданно. Практически каждая библиотека парсера / сериализации, которую я когда-либо использовал, либо (а) не требует геттеров / сеттеров, либо (б) имеет аннотации непосредственно к методам доступа ...