我正在尝试使用 openCSV 4.1 从 bean 列表中编写 CSV。但是,每当我运行我的程序时,我都会得到 CsvBeanIntrospectionException,然后是 NoSuchMethodException: Unknown property 'fieldx' on class 'class TestObject'
我已经成功地使用 reader 对应项将 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 转换成的类添加默认构造函数,它对我有用。
如果您使用的是 Lombok,请务必在您的 Pojo 之上添加一个@NoArgConstructor。
通过排除,我发现getter方法的名称必须与属性的名称匹配。通过下面的更正,现在我可以从对象列表写入 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;
}
//...
在我的例子中,构造函数没有被公开!
我也遇到过类似的问题
错误消息:给定 bean 类型的基本实例化(以及通过递归创建的从属 bean,如果适用)被确定为不可能
意味着,它试图创建对象,但由于 bean 类没有公共构造函数,因此它失败了。
解决方案:看看你的 bean 类,它必须有公共构造函数。如果您有 private 或 default 则它将不起作用。
快乐学习:)
我的情况是因为我正在测试 lib,所以我创建了一个非公共 bean 文件,这是问题所在,因此请确保 bean 文件是公共类文件,因为 lib 使用
CGLIB
代理该类,因此它需要访问它
就我而言,这是因为最终关键字:
@Data
@Accessors(chain = true)
public class CsvFile {
@CsvBindByName(column = "ColumnOne")
private final String columnOne;
}
删除
final
关键字后工作正常。
在我的例子中,我有默认构造函数和参数化构造函数。添加getters和setters后问题解决了
我为此目的使用了
lombok
,但我相信,在查看其他答案之后,您必须使用标准名称作为getter 和setter。自定义名称将不起作用。