Java 8日期时间类型序列化为Spring引导的对象

Java 8日期时间类型序列化为Spring引导的对象,spring,spring-boot,Spring,Spring Boot,我有一个实体,其字段为Java8日期时间类型。问题是这些字段被序列化为对象。我添加了jackson-datatype-jsr310依赖项,因此springboot1.5.7将自动配置处理java8日期时间类型的JavaTimeModule。似乎模块没有注册(我在JavaTimeModule构造函数中设置了一个断点)。我知道我不需要定制的ObjectMapper。我花了几个小时阅读关于这个问题的文章,解决方案总是添加jackson-datatype-jsr310依赖项,但它在我的情况下不起作用 实

我有一个实体,其字段为Java8日期时间类型。问题是这些字段被序列化为对象。我添加了
jackson-datatype-jsr310
依赖项,因此springboot1.5.7将自动配置处理java8日期时间类型的
JavaTimeModule
。似乎模块没有注册(我在JavaTimeModule构造函数中设置了一个断点)。我知道我不需要定制的
ObjectMapper
。我花了几个小时阅读关于这个问题的文章,解决方案总是添加
jackson-datatype-jsr310
依赖项,但它在我的情况下不起作用

实体:

@Entity
public class DateTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private LocalDate localDate;

    private LocalDateTime localDateTime;

    private Instant instant;

    private OffsetDateTime offsetDateTime;

    private ZonedDateTime zonedDateTime;

}
RestController方法:

@GetMapping("/datetimes/{id}")
public ResponseEntity<DateTimeEntity> getById(@PathVariable Long id) {
    DateTimeEntity dateTimeEntity = dateTimeRepository.findOne(id);
    return new ResponseEntity<DateTimeEntity>(dateTimeEntity, HttpStatus.OK);

}
POM文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>framework-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <mockito.version>2.11.0</mockito.version>
        <org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson.version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>1.5.5</version>
                <executions>
                    <execution>
                        <id>output-html</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>process-asciidoc</goal>
                        </goals>
                        <configuration>
                            <backend>html</backend>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

4.0.0
com.example
框架演示
0.0.1-快照
罐子
org.springframework.boot
spring启动程序父级
1.5.7.1发布
UTF-8
1.8
2.11.0
1.2.0.1最终版本
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
SpringBootStarterWeb
org.mapstruct
mapstruct-jdk8
${org.mapstruct.version}
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
com.h2数据库
氢
运行时
org.postgresql
postgresql
运行时
org.springframework.boot
弹簧起动试验
测试
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
${jackson.version}
测试
org.springframework.boot
springbootmaven插件
org.apache.maven.plugins
maven编译器插件
3.5.1
${java.version}
${java.version}
org.mapstruct
mapstruct处理器
${org.mapstruct.version}
org.ascidoctor
AscidActor maven插件
1.5.5
输出html
产生资源
过程ascidoc
html
根据:

任何类型为com.fasterxml.jackson.databind.Module的bean都将 自动注册到自动配置的 Jackson2ObjectMapperBuilder并应用于任何ObjectMapper实例 它所创造的。这就提供了一个全球机制来作出贡献 向应用程序添加新功能时自定义模块

仅仅添加依赖性是不够的,您必须声明模块的
@Bean
,如下所示:

@Bean
public Module dateTimeModule(){
    return new JavaTimeModule();
}

Plus
jackson-datatype-jsr310
模块已被弃用,您应该改用。

解决方案是将依赖项添加到类路径。出于某种原因,它不在IDE中

即使该依赖项已被弃用,它仍然被
spring boot autoconfigure
模块使用。看


com.fasterxml.jackson.datatype
jackson-datatype-jsr310

当它位于类路径中时,Java 8日期和时间对象被序列化为时间戳。

此Jackson模块已被弃用。阅读文档:,并使用未弃用的替换。我发现了一篇有用的帖子,作者在其中使用了参数
@JsonSerialize(using=LocalDateSerializer.class)
。除此之外,正如@JB所提到的,不要使用较新的maven depIt。它已被弃用,但您知道为什么Spring Boot Autoconfigure仍在使用它吗:您不需要声明bean,因为Spring Boot auto configure会自动注册它,如果在类路径中找到它,这是我的问题。jar不在IDE类路径中。谢谢你的分享,我有一个类似的问题,我通过声明bean解决了它,这也可能是由于类路径。很高兴知道!
@Bean
public Module dateTimeModule(){
    return new JavaTimeModule();
}
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>