首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在LocalDateTime和LocalDate上配置Jackson Serialization?

如何在LocalDateTime和LocalDate上配置Jackson Serialization?
EN

Stack Overflow用户
提问于 2018-07-26 05:17:28
回答 3查看 11.7K关注 0票数 2

我知道Stackoverflow上有很多关于这个话题的帖子,我相信我已经读到了几乎所有的帖子,但我仍然在努力让它工作,并感谢任何指导。

这是我正在使用的Spring Parent和Jackson Dependencies:

代码语言:javascript
复制
<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>

在我的应用程序配置中,我尝试使用:

代码语言:javascript
复制
@Autowired
void configureJackson(ObjectMapper jackson2ObjectMapper) {

    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")));

    jackson2ObjectMapper
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .registerModule(timeModule)
            .registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module())
            .registerModule(new JtsModule());
}

这就是我正在测试的模型。(我正试图在5-6个模型中实现同样的目标)。

代码语言:javascript
复制
public class DateRange implements Serializable {

     private static final long serialVersionUID = 6412487507434252330L;

     private LocalDateTime startTime;
     private LocalDateTime endTime;

     private LocalDate startDate;
     private LocalDate endDate;

     // Getters/Setters

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

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

更新

我将我的配置更改为下面建议的其中一个,并且非常接近解决这个问题。

代码语言:javascript
复制
@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使用者进行任何调整的方式无缝地进行这种更改。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-26 06:55:41

JavaTimeModule将为您完成繁重的工作。它为java.time类型提供了一组serializersdeserializers。如果禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPSjava.time类型将以标准ISO-8601字符串表示形式序列化。

默认情况下,Spring将为您提供一个由Jackson2ObjectMapperBuilder创建的ObjectMappper实例。此实例将自动为您配置。有关详细信息,请参阅documentation类。

如果要完全替换缺省ObjectMapper,请定义该类型的@Bean并将其标记为@Primary

代码语言:javascript
复制
@Bean
@Primary
public ObjectMapper objectMapper() {    
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return mapper;
}

或者,如果您更喜欢基于构建器的方法,可以定义一个Jackson2ObjectMapperBuilder @Bean

代码语言:javascript
复制
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.modules(new JavaTimeModule());
    builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return builder;
}

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

票数 7
EN

Stack Overflow用户

发布于 2018-07-27 03:15:20

Cassio和其他一些网上挖掘的帮助下,我终于实现了这一点。回过头来看,我认为问题在于我在JavaTimeModule上定义了自定义格式,但我需要在映射器上定义它们。

代码语言:javascript
复制
@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());
}

https://github.com/spring-projects/spring-boot/issues/4217

http://www.baeldung.com/jackson-serialize-dates

票数 3
EN

Stack Overflow用户

发布于 2018-07-26 11:56:04

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

代码语言:javascript
复制
@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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51527794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档