如何在LocalDateTime和LocalDate for Java上配置Jackson序列化?

如何在LocalDateTime和LocalDate for Java上配置Jackson序列化?,java,serialization,jackson,Java,Serialization,Jackson,我知道在Stackoverflow上有很多关于这个主题的帖子,我相信我已经读了几乎所有的帖子,但是我仍然在努力让它正常工作,希望得到任何指导 这是我正在使用的Spring父项和Jackson依赖项: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <

我知道在Stackoverflow上有很多关于这个主题的帖子,我相信我已经读了几乎所有的帖子,但是我仍然在努力让它正常工作,希望得到任何指导

这是我正在使用的Spring父项和Jackson依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>

<!-- Jackson -->
<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>
这就是我正在测试的模型。(我试图在5-6款车型中实现同样的效果)

我希望我能找到一种适用于全球的方法,而不需要我单独注释每个字段。我以前使用过java.util.Date,但在其他功能方面遇到了一些问题

试图使用这些更新(更好)的日期模型,而不是旧的损坏,这让我为一件简单的事情感到非常头痛


更新

我将配置更改为下面建议的配置之一,并且非常接近于解决此问题

@Bean
@Primary
public ObjectMapper objectMapper() {

    JavaTimeModule timeModule = new JavaTimeModule();

    timeModule.addDeserializer(LocalDate.class,
            new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

    timeModule.addDeserializer(LocalDateTime.class,
            new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

    timeModule.addSerializer(LocalDate.class,
            new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

    timeModule.addSerializer(LocalDateTime.class,
            new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

    return new ObjectMapper()
            //.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .registerModule(timeModule)
            .registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module())
            .registerModule(new JtsModule());
}
现在我唯一的问题是LocalDateTime在需要时打印时间戳,如:“2018-07-26T07:57:12.938”,如:2018-07-26 07:57:12

这些字段今天已经在使用,我需要以一种不需要API使用者进行任何调整的方式无缝地进行更改

提到禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS将以这种ISO格式打印时间戳,但这不是我需要的。我试图注释掉该字段,希望它能够获取我提供的自定义DateTimeFormatter,但是它没有改变我的输出。

将为您完成这项艰巨的工作。它为类型提供了一组和。如果禁用,类型将以标准字符串表示形式序列化


默认情况下,Spring将为您提供由创建的实例。此实例是为您自动配置的。有关详细信息,请参见该类

如果要完全替换默认值,请定义该类型的并将其标记为:

@Bean
@初级的
公共对象映射器ObjectMapper(){
ObjectMapper mapper=新的ObjectMapper();
registerModule(新的JavaTimeModule());
禁用(SerializationFeature.WRITE_DATES_作为时间戳);
返回映射器;
}
或者,如果您更喜欢基于生成器的方法,请定义一个

@Bean
公共Jackson2ObjectMapperBuilder对象MapperBuilder(){
Jackson2ObjectMapperBuilder=新Jackson2ObjectMapperBuilder();
modules(新的JavaTimeModule());
builder.featuresToDisable(SerializationFeature.WRITE_DATES_作为时间戳);
返回生成器;
}

请注意,在任何一种情况下,这样做都会禁用的所有自动配置。有关详细信息,请参阅。

您也可以解决此问题以公开此实例:

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.modules(new JavaTimeModule(),new ParameterNamesModule(),new Jdk8Module());
    builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return builder;
}

我终于在网络和其他一些挖掘的帮助下完成了这项工作。回顾过去,我认为问题在于我在JavaTimeModule上定义了自定义格式,但我需要在映射器上定义它们

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder()
            .createXmlMapper(false)
            .indentOutput(true)
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .serializers(
                    new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                    new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
            .deserializers(
                    new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                    new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
            .modules(
                    new JavaTimeModule(),
                    new ParameterNamesModule(),
                    new Jdk8Module(),
                    new JtsModule());
}


谢谢你的回答。这帮助我比以前更接近,但是,我似乎无法更改LocalDateTime打印的格式;即使在提供自定义DateTimeFormatter实现时也是如此。我更新了上面的问题,以显示我尝试过的代码以及解决此问题的更新进度。@jDub9我刚刚创建了一个独立的应用程序,配置了
ObjectMapper
,并使用问题中显示的序列化程序,将模型序列化为JSON,因为日期以正确的格式序列化。另外,取消注释
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)。
好的,所以我取消了那一行的注释,运行了一个mvn clean安装,以确保我的类路径没有使用任何旧设置,并且我仍然看到时间戳序列化为:2018-07-26T07:57:12.938,但是在我的代码中使用这些类LocalDateTime和LocalDate的任何地方,我都希望被全局处理;如果可能的话。
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.modules(new JavaTimeModule(),new ParameterNamesModule(),new Jdk8Module());
    builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return builder;
}
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder()
            .createXmlMapper(false)
            .indentOutput(true)
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .serializers(
                    new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                    new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
            .deserializers(
                    new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                    new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
            .modules(
                    new JavaTimeModule(),
                    new ParameterNamesModule(),
                    new Jdk8Module(),
                    new JtsModule());
}