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

问题描述 投票:0回答:1

我正在使用 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 片段:

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

build.gradle 片段:

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

json spring-mvc spring-boot jackson
1个回答
13
投票

您的应用程序正在创建自己的

RestTemplate
bean,并且未对其应用任何自定义。这意味着它将使用默认消息转换器和默认 Jackson 配置,而不是 Spring Boot 配置的任何内容。

如参考文档中描述的,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"}
    
© www.soinside.com 2019 - 2024. All rights reserved.