我有一个简单的应用程序,其中包含Sping Boot 和Jetty。我有一个简单的控制器,它返回一个对象,该对象包含Java 8 ZonedDateTime
:
public class Device {
// ...
private ZonedDateTime lastUpdated;
public Device(String id, ZonedDateTime lastUpdated, int course, double latitude, double longitude) {
// ...
this.lastUpdated = lastUpdated;
// ...
}
public ZonedDateTime getLastUpdated() {
return lastUpdated;
}
}
在我的RestController
中,我只拥有:
@RequestMapping("/devices/")
public @ResponseBody List<Device> index() {
List<Device> devices = new ArrayList<>();
devices.add(new Device("321421521", ZonedDateTime.now(), 0, 39.89011333, 24.438176666));
return devices;
}
我希望ZonedDateTime
按照ISO格式进行格式化,但我得到的是类的整个JSON转储,如下所示:
"lastUpdated":{"offset":{"totalSeconds":7200,"id":"+02:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"zone":{"id":"Europe/Berlin","rules":{"fixedOffset":false,"transitionRules":[{"month":"MARCH","timeDefinition":"UTC","standardOffset":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetBefore":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetAfter":{"totalSeconds":7200,"id":"+02:00", ...
我只有一个spring-boot-starter-web
应用程序,使用spring-boot-starter-jetty
,不包括spring-boot-starter-tomcat
。
为什么Jackson在春 Boot 里会这样?
更新
对于那些寻找一个完整的一步一步的指南如何解决这个问题,我发现这个问题后,问:http://lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/
5条答案
按热度按时间nszi6y051#
有一个库jackson-datatype-jsr310。试试看。
此库涵盖了新的datetime API,还包括用于
ZonedDateTime
的序列化程序。您只需要添加
JavaTimeModule
即可:要将日期时间转换为
ISO-8601
字符串,您应该禁用WRITE_DATES_AS_TIMESTAMPS
功能。您可以通过覆盖ObjectMapper
bean或使用应用程序属性轻松地完成此操作:6tdlim6h2#
如果你不依赖SpringBoot的自动配置特性--你没有在配置文件中提供
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
属性--或者出于某种原因你手动创建了ObjectMapper
示例。你可以通过编程方式禁用这个特性,如下所示:这是给Jackson
2.8.7
qyzbxkaa3#
上面已经提到了答案,但是我认为它缺少了一些信息。对于那些希望以多种形式解析Java 8时间戳(不仅仅是ZonedDateTime)的人来说,你需要在POM中安装最新版本的
jackson-datatype-jsr310
,并注册以下模块:若要测试此程式码
请注意,您可以在Spring或dropwizard中全局配置对象Map器来实现这一点。我还没有找到一种干净的方法,可以在不注册自定义(反)序列化程序的情况下,将其作为字段上的注解来实现这一点。
efzxgjgh4#
对于Jackson
2.10
及更高版本,父pom.xml
模块pom.xml
JsonMapper创建,可能在您的
@Configuration
类中进一步阅读:
JsonMapper
instead ofObjectMapper
wa7juj8i5#
application.yml
中的spring.jackson.serialization.write-dates-as-timestamps=false
设置在我们的项目中没有帮助。很可能是因为有其他库在使用Jackson:Swagger / OpenAPI / OpenAPI生成器。将
RequestMappingHandlerAdapter
的这个@EventListener
添加到@SpringBootApplication
类中会有所帮助。我在这里找到了这个解决方案-https://github.com/FasterXML/jackson-modules-java8/issues/11#issuecomment-913199874。