OpenCSV - 注册自定义转换器

6

我正在使用opencsv将csv转换为Java Bean对象。对于基本数据类型,这一切都很顺利,但是当我想要使用枚举类型时就遇到了问题。

我正在检查代码,似乎需要完全实现一个新的映射策略来设置自定义转换器。是否有更好的方法可以解决这个问题呢?

以下是当前的转换代码:

CsvToBean<MyType> csvBean = new CsvToBeanBuilder<MyType>(new FileReader(csvFile))
                 .withType(MyType.class)
                 .withIgnoreLeadingWhiteSpace(true)
                 .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_QUOTES)
                 .build();

我发现一些2012年的问题与此相关,但答案对于当前的opencsv版本(4.2)不再适用。


你可以通过使用自定义setter来解决这个问题,该setter接受一个字符串但使用枚举作为类型的属性字段。只需执行MyEnum.valueOf()即可。 - Jilles van Gurp
2个回答

10

好的,事实证明有一个注释@CsvCustomBindByName(column = 'foo', converter = Bar.class)

可以完全满足我的需求。只需要确保这个类是<T> extends AbstractBeanField<T>类型。


你能否将依赖项传递给这个自定义转换器类?例如,我想将一个依赖项传递给转换器类的构造函数,该依赖项将用于转换初始值。 public Bar(MyDependency instance){} - nabster

1

在类似的情况下,我所做的是将一堆原始数据转化为一个复杂对象(即包含嵌套对象的对象),这时我会使用中间对象。我称之为DTO(数据传输对象),虽然可能有更合适的名称,openCSV会填充它,然后DTO可以从其中包含的原始数据构建出我想要的复杂对象。


我发现了一种基于注解的方法,这对你也可能有用。 - Kristof Plennings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,