在使用 OpenCSV 时获取 CsvBeanIntrospectionException

问题描述 投票:0回答:8

我正在尝试使用 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();        
    }
}
java javabeans opencsv
8个回答
11
投票

我遇到了类似的错误,尝试为要将 CSV 转换成的类添加默认构造函数,它对我有用。


7
投票

如果您使用的是 Lombok,请务必在您的 Pojo 之上添加一个@NoArgConstructor。


4
投票

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

2
投票

在我的例子中,构造函数没有被公开!


2
投票

我也遇到过类似的问题

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

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

解决方案:看看你的 bean 类,它必须有公共构造函数。如果您有 private 或 default 则它将不起作用。

快乐学习:)


0
投票

我的情况是因为我正在测试 lib,所以我创建了一个非公共 bean 文件,这是问题所在,因此请确保 bean 文件是公共类文件,因为 lib 使用

CGLIB
代理该类,因此它需要访问它


0
投票

就我而言,这是因为最终关键字:

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

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

删除

final
关键字后工作正常。


0
投票

在我的例子中,我有默认构造函数和参数化构造函数。添加getters和setters后问题解决了

我为此目的使用了

lombok
,但我相信,在查看其他答案之后,您必须使用标准名称作为getter 和setter。自定义名称将不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.