我正在使用opencsv创建一个这样的CsvToBean
:
CsvToBean<AccountBean> csvToBean = new CsvToBeanBuilder<AccountBean>(new InputStreamReader(inputStream))
.withFieldAsNull(CSVReaderNullFieldIndicator.NEITHER)
.withType(AccountBean.class)
.build();
这是我的AccountBean
:
public class AccountBean extends BeanBase<Account>
{
@CsvBindByName(column = "Id", required = true)
public String salesforceId;
@CsvBindByName(column = "OwnerId", required = true)
public String ownerId;
@CsvBindByName(column = "Name", required = true)
public String name;
// billing address
@CsvBindByName(column = "BillingStreet")
String billingStreet;
@CsvBindByName(column = "BillingCity")
String billingCity;
@CsvBindByName(column = "BillingState")
String billingState;
@CsvBindByName(column = "BillingPostalCode")
String billingPostcode;
@CsvBindByName(column = "BillingCountry")
String billingCountry;
}
问题出在地址字段上 - 如果有空白字段,无论我传递给.withFieldAsNull()
哪个CSVReaderNullFieldIndicator
值,它们始终为 NULL
。我的csv文件有双引号来表示空字段,因此使用CSVReaderNullFieldIndicator.BOTH(无论如何都是默认的)应该产生一个空字符串。
这会导致问题,因为我将空值保存到我的数据存储,然后稍后会导致空指针异常。
我做错了什么?
我正在尝试您的方法,我有相同的行为。由于这个库是开源的,我一直在挖掘它为什么会发生。
- 在
CsvToBean
类中,您有一个CSVReader
负责 访问要读取的数据。 - 在
CSVReader
里面,你有一个CSVParser,它负责获取单个字符串,并根据分隔符、引号和转义字符将其解析为元素。 CSVParser
包含CSVReaderNullFieldIndicator
(enum) 的成员,用于告诉CSVParser
什么被视为 null。
当你在代码CsvToBean
中调用 build() 时,CSVReader
和CSVParser
会根据你传递给CsvToBeanBuilder
的信息进行实例化。
当您调用时,parse()
CSVReader
将遍历您的 CSV 文件,对于每行,它将调用CSVParser
.根据您的分隔符,解析器将返回一个 String 值数组。此时,基于 NullFieldIndicator的 CSVParser,将考虑将字符串保留为空或将其设为空。最后,如果将 NullFieldIndicator 属性作为NEITHER
,并且考虑的行是,例如,"one";",则解析器返回的字符串数组将是 [one,"] 或 [one, null] 如果CSVReaderNullFieldIndicator
BOTH
或EMPTY_QUOTES
。
在此阶段之后,解析的行将映射到AccountBean
字段。要确定该字段为空,请使用 StringUtils.isNotBlank()。
结论:无论你传递给 withFieldAsNull() 什么,因为 " 或null
被认为是StringUtils.isNotBlank()
false
的,因此该字段将为 null。
您可以询问开发人员此行为是否是预期行为。也许他有原因,或者这只是一个错误。
这需要一些思考,因为问题出在 BeanFieldPrimitiveType 类中,该类仅在有值时才设置一个值(因此空字段将导致空值)。 这是因为这是转换为所有类型的,并且大多数不处理空字符串(整数)。 因此,需要修改此类以检查字段的类型,如果它是一组特定的类型(现在是 String),则允许转换空值。
我在您在sourceforge中打开的错误中发布了上述内容,我们将尝试在openCSV的4.1或4.2中修复。