【问题标题】:Fix Jackson cannot construct instance of Java.time.LocalDate修复 Jackson 无法构造 Java.time.LocalDate 的实例
【发布时间】:2020-04-21 01:20:05
【问题描述】:

我正在尝试使用 Jackson csv Mapper 读取 csv 文件并将条目映射到具有 LocalDate 字段的 Pojo。尝试解析文件时出现以下错误

无法构造java.time.LocalDate 的实例(没有创作者,比如 默认构造,存在):无字符串参数构造函数/工厂 从字符串值反序列化的方法('2019-12-01')\n [来源: (com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader)

我已经尝试了其他答案中给出的方法,但仍然得到相同的结果,只有有效的注释是

@JsonDeserialize(使用 = LocalDateDeserializer.class)

我试图创建一个 Object Mapper 的 bean 并在我创建的应用程序配置文件中注册它的模块,但仍然没有效果。请有人帮助我

波乔

@Data
class TestImport{

@JsonProperty("start_date")
LocalDate startDate;
}

对象映射器配置:

 @Bean
    @Primary
    public ObjectMapper objectMapper(){
        ObjectMapper objectMapper=new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }

文件读取代码:

public  <T> List<T> read(Class<T> Entity, MultipartFile file) throws Exception{
            InputStream inputStream = new BufferedInputStream(file.getInputStream());
            CsvSchema schema = csvMapper.schemaFor(Entity).withHeader().withColumnReordering(true);
            ObjectReader reader = csvMapper.readerFor(Entity).with(schema);
            List<T> result= reader.<T>readValues(inputStream).readAll();
            inputStream.close();
            return result;
    }

Pom.xml

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-parameter-names</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-csv</artifactId>
            <version>2.10.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.github.millij/poi-object-mapper -->
        <dependency>
            <groupId>io.github.millij</groupId>
            <artifactId>poi-object-mapper</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>

        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
    </dependencies>

【问题讨论】:

  • 您可以将其读取为字符串并将其从日历或日期转换为本地日期吗?
  • 您如何阅读这个CSV 文件?对于CSV,您需要使用CsvMapper
  • 你确定你创建的ObjectMapper是被使用的那个吗?
  • 能否请您发布您的完整 pom.xml,以便我们知道使用的是哪个 Spring 版本并且没有其他代码干扰,请发布您用于读取 csv 的代码
  • 我不确定是否正在使用对象映射器,但既然我给了它@Primary 注释,这应该可以工作吗?

标签: java spring-boot jackson


【解决方案1】:

jackson-datatype-jsr310 在 Springs 自己的博客 Jackson-Modules Spring Blog 中所述的类路径上默认注册,因此根本无需在新的 ObjectMapper 中手动注册。

【讨论】:

    【解决方案2】:

    在你的 pojo 中你需要设置注解
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") 有关更多详细信息,请查看问题Spring Data JPA - ZonedDateTime format for json serialization 的答案

    【讨论】:

    • 如果我有 20 个带有日期字段的 Pojo,我是否需要在每个 POJO 课程中都写这个?
    • 是的,就像任何其他注释一样。但是你注释一个属性,而不是整个类。它是一个属性级别的注释。首先,试一试,看看它是否有效
    • 但是如果我想让序列化器和反序列化器独立工作而不用担心这些额外的注释呢?我使用了有问题的注释并且它有效,但我想设计一个更一致和通用的解决方案
    • 我相信您需要编写一个自定义反序列化器,但我还没有这样做。所以,我不知道细节。注释虽然是可接受的解决方案
    猜你喜欢
    • 2018-07-29
    • 2020-09-27
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多