Почему Univocity выдает ошибку CsvParser при использовании LocalDate в качестве типа данных для POJO и как его восстановить? - PullRequest
1 голос
/ 03 апреля 2019

Я использую 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 Ответ

1 голос
/ 04 апреля 2019

Univocity-парсеры все еще построены на 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) скоро появится с поддержкойэто и многое другое.

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

...