SpringBoot RestTemplate 忽略 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

Posted

技术标签:

【中文标题】SpringBoot RestTemplate 忽略 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false【英文标题】:SpringBoot RestTemplate ignores spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false 【发布时间】:2018-04-23 16:38:03 【问题描述】:

我正在使用 OffsetDateTime 对象。

我想以 ISO 格式输出这种类型,所以我将上述属性添加到我的 application.yml 中,当我在控制器中使用它时它工作正常。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Schedule

    private OffsetDateTime time;
    private String mode;

在我的控制器中使用:

public ResponseEntity taskManagerTest() 
    Schedule bpTaskManagerRequest = new Schedule();

    return ResponseEntity.status(HttpStatus.CREATED).headers(null).body(bpTaskManagerRequest);

返回对象时的示例结果:


  "time": "2017-11-12T15:03:05.171Z",
  "mode": "eSetTime"

但是,如果我在 Spring 服务中使用相同的对象使用 RestTemplate 进一步发送它:

    HttpEntity<Schedule> httpEntity = new HttpEntity<>(bpTaskManagerRequest, headers);

    ResponseEntity<String> answer = restTemplate.exchange(bpTaskManagerURL, HttpMethod.POST, httpEntity,
            String.class);

序列化为:


    "time": 1510498985.171000000,
    "mode": "eSetTime"

我的 RestTemplate 定义为:

@Autowired
private RestTemplate restTemplate;

application.yml sn-p:

spring:
    jackson:
        serialization:
            write-dates-as-timestamps: false

build.gradle sn-p:

buildscript 
    ext 
        springBootVersion = '1.5.4.RELEASE'
        ext.kotlin_version = '1.1.51'
    

compile('com.fasterxml.jackson.module:jackson-module-parameter-names')
compile('com.fasterxml.jackson.datatype:jackson-datatype-jdk8')
compile('com.fasterxml.jackson.datatype:jackson-datatype-jsr310')

示例项目:https://github.com/deepres/OffsetDateTime-with-RestTemplate

【问题讨论】:

能否请您发布您的 application.yml 和其他相关配置? 我提供了更多信息 您的样本不完整,因此很难判断发生了什么。您能否分享一个完整的示例,显示接收 REST 模板发出的请求的代码以及您如何确定请求是如何被序列化的? @AndyWilkinson 这是示例项目的链接:github.com/deepres/OffsetDateTime-with-RestTemplate 【参考方案1】:

您的应用程序正在创建自己的RestTemplate bean,并且没有对其应用任何自定义。这意味着它将使用默认的消息转换器和默认的 Jackson 配置,而不是 Spring Boot 配置的任何东西。

作为described in the reference documentation,Spring Boot 提供了一个RestTemplateBuilder,可以用来创建一个RestTemplate。它“将确保将合理的HttpMessageConverters 应用于RestTemplate 实例”。您可以通过将 WebConfiguration 更改为以下内容来更新您的示例以使用它:

package com.example.demo;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.boot.web.client.RestTemplateBuilder;

@Configuration
public class WebConfiguration 

    @Bean
    public RestTemplate getRestTemplate(RestTemplateBuilder builder) 
        return builder.build();
    


有了这个变化,转换现在是一致的:

2017-11-17 12:35:02.892  INFO 28527 --- [nio-8080-exec-2] com.example.demo.ExampleController       : Rest template: "label":"test from controller","time":"2017-11-17T12:35:02.821Z"
2017-11-17 12:35:02.905  INFO 28527 --- [nio-8080-exec-1] com.example.demo.DemoService             : Object mapper:"label":"test from controller","time":"2017-11-17T12:35:02.821Z"

【讨论】:

非常感谢,对文档的引用也确实为我澄清了这个概念。

以上是关于SpringBoot RestTemplate 忽略 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot系列之RestTemplate使用示例

SpringBoot使用RestTemplate

重学springboot系列番外篇之RestTemplate

springboot2.0集成RestTemplate

springboot使用restTemplate post提交值 restTemplate post值

如何解决SpringBoot中RestTemplate的中文乱码问题?