我尝试使用openCSV 4.1从bean列表中编写CSV。然而,每当我运行程序时,我都会收到CsvBeanIntrospectionException,然后是NoSuchMethodException:类“class TestObject”上的未知属性“fieldx”
我已经成功地使用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();
}
}
8条答案
按热度按时间ioekq8ef1#
我得到了一个类似的错误,尝试添加一个默认的构造函数的类,你想转换成CSV,它为我工作。
72qzrwbm2#
如果您使用的是Lombok,请确保在Pojo顶部添加@NoArgConstructor。
s8vozzvw3#
通过消除,我发现getter方法的名称必须与属性的名称匹配。通过下面的更正,现在我可以从对象列表中写入CSV。
yxyvkwin4#
在我的例子中,构造函数没有被声明为public!
hfyxw5xn5#
我也遇到过类似的问题。
错误信息:给定bean类型(以及通过递归创建的从属bean,如果适用的话)的基本示例化被确定为不可能
这意味着,它试图创建Object,但由于bean类没有公共构造函数,因此失败。
决议:看看你的bean类,它必须有公共构造函数。如果你有私有或默认,那么它将无法工作。
happy learning:)
rsl1atfo6#
我的情况是,因为我正在测试库,所以我创建了一个非公共bean文件,这是问题所在,因此请确保bean文件是公共类文件,因为库使用
CGLIB
代理类,因此需要访问它ymdaylpp7#
在我的例子中,这是因为最后一个关键字:
在删除
final
关键字后工作正常。9w11ddsr8#
在我的例子中,我有默认的和参数化的构造函数。在添加getters和setters之后,问题解决了。
我使用lombok来实现这个目的,但是我相信(看看其他的答案),你必须为getter和setter使用标准的名字,自定义的名字是行不通的。