spring OpenCSV未将空字符串转换为空POJO字段

btqmn9zl  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(222)

使用OpenCSV 5.9
我应该如何配置我的CsvToBeanBuilder在我的POJO上将空字符串转换为null。例如,我希望以下POJO的“lastName”具有null值-而不是值""。我认为设置.withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)可以工作,但我仍然看到空字符串作为lastName的值,而不是null

CSV示例

  1. "FIRST_NAME","LAST_NAME"
  2. "Bob",""

字符串

POJO

  1. @Data
  2. @NoArgsConstructor
  3. @EqualsAndHashCode
  4. public class Person {
  5. @CsvBindByName(column = "FIRST_NAME")
  6. private String firstName;
  7. @CsvBindByName(column = "LAST_NAME")
  8. private String lastName;
  9. }

解析器

  1. @Slf4j
  2. @Component
  3. @Qualifier("CsvParser")
  4. public class CsvParser implements FileParser {
  5. @Override
  6. public List<Person> parse(InputStream inputStream) {
  7. log.debug("Parsing InputStream as CSV");
  8. return new CsvToBeanBuilder<Person>(new CSVReader(new InputStreamReader(inputStream)))
  9. .withType(Person.class)
  10. .withSeparator(',')
  11. .withIgnoreLeadingWhiteSpace(true)
  12. .withIgnoreEmptyLine(true)
  13. .withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)
  14. .build()
  15. .parse();
  16. }
  17. }

Pom依赖

  1. <dependency>
  2. <groupId>com.opencsv</groupId>
  3. <artifactId>opencsv</artifactId>
  4. <version>5.9</version>
  5. </dependency>

0ejtzxu1

0ejtzxu11#

我最终只是写了一个自定义转换器,并使用@CsvCustomBindByName

POJO

  1. @Data
  2. @NoArgsConstructor
  3. @EqualsAndHashCode
  4. public class Person {
  5. @CsvCustomBindByName(column = "FIRST_NAME", converter = NonEmptyStringConverter.class)
  6. private String firstName;
  7. @CsvCustomBindByName(column = "LAST_NAME", converter = NonEmptyStringConverter.class)
  8. private String lastName;
  9. }

字符串

转换器

  1. public class NonEmptyStringConverter extends AbstractBeanField {
  2. @Override
  3. protected String convert(String s)
  4. throws CsvDataTypeMismatchException, CsvConstraintViolationException {
  5. return StringUtils.isNotEmpty(s) ? s : null;
  6. }

展开查看全部

相关问题