使用 OpenCSV 5.9
我应该如何配置
CsvToBeanBuilder
以将 POJO 上的空字符串转换为 null。例如,我希望以下 POJO 对于“lastName”具有 null
值 - 而该值是 ""
。我认为设置 .withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)
会起作用,但我仍然看到空字符串作为 lastName
的值,而不是 null
"FIRST_NAME","LAST_NAME"
"Bob",""
@Data
@NoArgsConstructor
@EqualsAndHashCode
public class Person {
@CsvBindByName(column = "FIRST_NAME")
private String firstName;
@CsvBindByName(column = "LAST_NAME")
private String lastName;
}
@Slf4j
@Component
@Qualifier("CsvParser")
public class CsvParser implements FileParser {
@Override
public List<Person> parse(InputStream inputStream) {
log.debug("Parsing InputStream as CSV");
return new CsvToBeanBuilder<Person>(new CSVReader(new InputStreamReader(inputStream)))
.withType(Person.class)
.withSeparator(',')
.withIgnoreLeadingWhiteSpace(true)
.withIgnoreEmptyLine(true)
.withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)
.build()
.parse();
}
}
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.9</version>
</dependency>
我最终只是编写了一个自定义转换器并使用
@CsvCustomBindByName
。
@Data
@NoArgsConstructor
@EqualsAndHashCode
public class Person {
@CsvCustomBindByName(column = "FIRST_NAME", converter = NonEmptyStringConverter.class)
private String firstName;
@CsvCustomBindByName(column = "LAST_NAME", converter = NonEmptyStringConverter.class)
private String lastName;
}
public class NonEmptyStringConverter extends AbstractBeanField {
@Override
protected String convert(String s)
throws CsvDataTypeMismatchException, CsvConstraintViolationException {
return StringUtils.isNotEmpty(s) ? s : null;
}