如何使用opencsv构建(工作中的)自定义转换器

时间:2019-06-17 07:30:56

标签: java opencsv converters

我正在使用带有嵌套bean结构的OpenCSV。但是,我需要一个自定义转换器来实现这一目标(当前着重于对csv部分的编写)。我环顾四周,但找不到任何示例可以帮助我弄清楚如何使其工作。

我尝试扩展子bean类以及主要文档中提供的一些转换。但是我已经没有足够的资源了,我走得最远的就是让它抛出CsvBadConverterException。

让我告诉你我有什么。 (以防万一,User和UserScore都实现了Serializable。) 父级bean:用户

    @CsvBindByName(column = "totalScore")
    private int totalScore;
    @CsvBindByName(column = "currentScore")
    private int currentScore;
    @CsvBindByName(column = "highestStreak")
    private int highestStreak;

    // Even more basic getter, setter, etc.

子bean:UserScore

    public abstract class UserScoreToBean extends AbstractBeanField<User> {
    @Override
    protected Object convert(String s) {
        UserScore score = new UserScore();
        String[] split = s.split(".", 3);
        score.setTotalScore(Integer.valueOf(split[0]));
        score.setCurrentScore(Integer.valueOf(split[1]));
        score.setHighestStreak(Integer.valueOf(split[2]));
        return score;
//        return null;
    }

    @Override
    protected String convertToWrite(Object value) throws CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
        UserScore score = (UserScore) value;

        return "\"" + score.getTotalScore() + "." + score.getCurrentScore() + "." + score.getHighestStreak() + "\"";
//        return super.convertToWrite(value);
    }
    }

转换器:UserScoreToBean

List<String> codes = objMasters.stream().map(obj -> obj.getCode()).collect(Collectors.toList());
boolean match = codes.containsAll(keySet);

您可以看到我的转换器基本正常。因此,我很乐意为您提供任何帮助。 为了简化故障排除,我刚让我的程序尝试在启动时生成标头,这给了我这个异常:

com.opencsv.exceptions.CsvBadConverterException:实例化自定义转换器settings.user.UserScoreToBean时出现问题。

感谢阅读!

1 个答案:

答案 0 :(得分:1)

使用opencsv 5.0及其新的注释@CsvRecurse。然后,来自嵌套对象的项目将在csv中显示为顶级。

如果您出于任何原因无法更改库,那么我将看一看CsvBindAndSplitByName“注释,但这需要进行一些调整。