我在 SpringBoot 中遇到了 Jackson 的问题。我的 Controller 以 yyyy-MM-dd'T'HH:mm:ss'Z'
格式返回日期,但我需要 yyyy-MM-dd'T'HH:mm:ss。 SSS'Z'
(用于使用 date-fns 库的 Angular 中的 mwl-calendar)。
Controller :
@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>
我尝试过:
- 使用
@JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
注解 - 使用
spring.jackson.date-format=yyyyMMddTHH:mm:ss.SSSZ
配置 - 手动创建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;
}
- 启用选项
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、Jackson 2.13.3
出了什么问题?
最佳答案
您可以为 Instant 类型创建自定义 json 序列化程序:
public static class InstantSerializer extends StdSerializer<Instant> {
public InstantSerializer() {
super(Instant.class);
}
@Override
public void serialize(
@Nullable final Instant value,
@NonNull final JsonGenerator jsonGenerator,
@NonNull final SerializerProvider serializerProvider
) throws IOException {
if (value != null) {
final DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.withZone(ZoneId.systemDefault());
final String text = formatter.format(value);
jsonGenerator.writeString(text);
}
}
}
然后在您想要遵循格式的字段上使用它:
@Data
public class SlotResponse {
@JsonSerialize(using = InstantSerializer.class) // Add this
private Instant start;
@JsonSerialize(using = InstantSerializer.class) // Add this
private Instant end;
}
如果您想让这适用于您的整个系统,您可以将序列化器添加到 jackson:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
...
final SimpleModule module = new SimpleModule();
module.addSerializer(new InstantSerializer());
mapper.registerModule(module);
...
return mapper;
}
关于java - Spring Boot Jackson 日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76225352/