我在SpringBoot遇到了Jackson的问题。我的控制器以yyyy-MM-dd'T'HH:mm:ss'Z'
返回日期,但我需要yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
(用于使用date-fns库的angular中的mwl-calendar)。
控制器:
@GetMapping(value = "/slots", produces = MediaType.APPLICATION_JSON_VALUE)
public Set<SlotResponse> timeSlots() {
return slotService.getSlots();
}
插槽响应:
@Data
public class SlotResponse {
private Instant start;
private Instant end;
}
其他依赖性:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
我试过:
1.使用@JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
注解
1.使用spring.jackson.date-format=yyyyMMddTHH:mm:ss.SSSZ
配置
1.要手动创建ObjectMapper,请执行以下操作:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
return mapper;
}
1.启用选项SerializationFeature.WRITE_DATES_WITH_ZONE_ID
和SerializationFeature.WRITE_DATES_WITH_CONTEXT_TIME_ZONE
但这一切都没有发生作用。每次看到这个结果:
[{"start":"2023-05-11T16:00:00Z","end":"2023-05-11T17:00:00Z"}]
我使用Java 17,SpringBoot 2.7.0,Jackson2.13.3
怎么了?
2条答案
按热度按时间6rqinv9w1#
您可以为Instant类型创建自定义json序列化器:
然后在您要遵循格式的字段上使用它:
如果你想让它应用于你的整个系统,你可以将序列化器添加到Jackson:
ercv8c1e2#
抱歉,无法复制
与(only)
,(简称)“dto”:
以及:
(no其他设置,属性,只有默认值..),我们得到:
这看起来非常像所需的格式。(??)
我一加:
,我得到:
(->
/error
->404
)!?深入
'Z'
表示“文字Z”Z
指的是“区域偏移”(格式为+HHMM
,请参见DateTimeFormatterBuilder+源文档)X
是“区域偏移”(如Z
所述)或(文字)'Z'
(如果是“零偏移”/UTC!DateTimeFormatter
:)实现方法:
@JsonFormat(timezone = "..." //,...
spring.jackson.time-zone
...(显式)设置“config time zone”,参见Set Jackson Timezone for Date deserialization
spring.jackson.serialization.WRITE_DATES_WITH_CONTEXT_TIME_ZONE=true
,参见源代码(您的版本)给定(例如)
何时/然后
'Z'
时,则得到"...Z"
Z
时,则得到"...+0000"
X
时,我们(也)得到"...Z"
相关,但旧:
相关,但不够深入/精确(毫秒):