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

问题描述 投票:0回答:1

使用 OpenCSV 5.9

我应该如何配置

CsvToBeanBuilder
以将 POJO 上的空字符串转换为 null。例如,我希望以下 POJO 对于“lastName”具有
null
值 - 而该值是
""
。我认为设置
.withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)
会起作用,但我仍然看到空字符串作为
lastName
的值,而不是
null

CSV 示例

"FIRST_NAME","LAST_NAME"
"Bob",""

POJO

@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();
  }
}

Pom依赖

    <dependency>
      <groupId>com.opencsv</groupId>
      <artifactId>opencsv</artifactId>
      <version>5.9</version>
    </dependency>
java spring opencsv
1个回答
0
投票

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

@CsvCustomBindByName

POJO

@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;
  }

© www.soinside.com 2019 - 2024. All rights reserved.