代码之家  ›  专栏  ›  技术社区  ›  yajiv

为什么在使用LocalDate作为POJO的数据类型时univocity的CsvParser会抛出错误,以及如何重新爱上它?

  •  0
  • yajiv  · 技术社区  · 5 年前

    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 . 如果是这样的话,它怎么能 int ?

    无法将“java.lang.String”类型的值“2019-01-12”设置为字段属性“c” ?(不改变数据类型 TempClass.c )

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jeronimo Backes    5 年前

    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)很快就要发布了,它支持这一点,还有更多。

    希望这有帮助。