Почему CsvParser выдает ошибку univocity при использовании LocalDate в качестве типа данных для POJO и как ее повторно использовать?

#java #string #csv #localdate #univocity

#java #строка #csv #localdate #однозначность

Вопрос:

Я использую CSVParser от Univocity для чтения файла CSV. Мой POJO выглядит примерно так.

 import java.time.LocalDate;
import com.univocity.parsers.annotations.NullString;
import com.univocity.parsers.annotations.Parsed;
import lombok.Builder;
import lombok.Getter;

@Getter
@Setter
public class TempClass {

    @Parsed(field = "A")
    private int a;

    @Parsed(field = "B")
    private String b;

    @Parsed(field = "C")
    private LocalDate c;
}
  

Мой файл CSV выглядит примерно так:-

 A,B,C
1,"Hi","2019-01-12"
2,"Hey","2019-01-13"
3,"Hello","2019-01-14"
  

Теперь, когда я пытаюсь прочитать этот файл с помощью CsvParser, он выдает сообщение об ошибке Unable to set value '2019-01-12' of type 'java.lang.String' to field attribute 'c' .

Здесь я предполагаю, что это выдает ошибку, потому что она не может неявно преобразовать String в LocalDate . Если это так, то как он может преобразовать String в int ?

Есть ли способ устранить ошибку Unable to set value '2019-01-12' of type 'java.lang.String' to field attribute 'c' ?(без изменения типа данных TempClass.c )

Ответ №1:

Univocity-parsers по-прежнему построен на Java 6. LocalDate напрямую не поддерживается из коробки, но может обеспечить преобразование самостоятельно. Что-то вроде:

 public class LocalDateFormatter implements  Conversion<String, LocalDate> {

    private DateTimeFormatter formatter;

    public LocalDateFormatter(String... args) {
        String pattern = "dd MM yyyy";
        if(args.length > 0){
            pattern = args[0];
        }
        this.formatter = DateTimeFormatter.ofPattern(pattern);
    }

    @Override
    public LocalDate execute(String input) {
        return LocalDate.parse(input, formatter);
    }

    @Override
    public String revert(LocalDate input) {
        return formatter.format(input);
    }
}
  

Затем аннотируйте свои поля с помощью @Convert и укажите свой класс преобразования:»

 @Parsed(field = "C")
@Convert(conversionClass = LocalDateFormatter.class, args = "yyyy-MM-dd")
private LocalDate c;
  

Скоро выйдет следующая версия (3.0.0) с поддержкой этого и многого другого.

Надеюсь, это поможет.