java 使用OpenCSV时获取CsvBeanIntrospectionException

nbnkbykc  于 2023-03-28  发布在  Java
关注(0)|答案(8)|浏览(284)

我尝试使用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();        
    }
}
ioekq8ef

ioekq8ef1#

我得到了一个类似的错误,尝试添加一个默认的构造函数的类,你想转换成CSV,它为我工作。

72qzrwbm

72qzrwbm2#

如果您使用的是Lombok,请确保在Pojo顶部添加@NoArgConstructor。

s8vozzvw

s8vozzvw3#

通过消除,我发现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;
    }
//...
yxyvkwin

yxyvkwin4#

在我的例子中,构造函数没有被声明为public!

hfyxw5xn

hfyxw5xn5#

我也遇到过类似的问题。

错误信息:给定bean类型(以及通过递归创建的从属bean,如果适用的话)的基本示例化被确定为不可能

这意味着,它试图创建Object,但由于bean类没有公共构造函数,因此失败。

决议:看看你的bean类,它必须有公共构造函数。如果你有私有或默认,那么它将无法工作。

happy learning:)

rsl1atfo

rsl1atfo6#

我的情况是,因为我正在测试库,所以我创建了一个非公共bean文件,这是问题所在,因此请确保bean文件是公共类文件,因为库使用CGLIB代理类,因此需要访问它

ymdaylpp

ymdaylpp7#

在我的例子中,这是因为最后一个关键字:

@Data
@Accessors(chain = true)
public class CsvFile {

    @CsvBindByName(column = "ColumnOne")
    private final String columnOne;
}

在删除final关键字后工作正常。

9w11ddsr

9w11ddsr8#

在我的例子中,我有默认的和参数化的构造函数。在添加getterssetters之后,问题解决了。
我使用lombok来实现这个目的,但是我相信(看看其他的答案),你必须为getter和setter使用标准的名字,自定义的名字是行不通的。

相关问题