我正在尝试实现一些非常简单的事情,即将全局时间格式设置为 Spring Boot 应用程序中序列化的所有 json...我已经尝试了其他问题的许多建议,但看起来杰克逊选择忽略我的任何配置设置为对象映射器,我的代码是
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm")));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm")));
mapper.registerModule(javaTimeModule);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(SerializationFeature.WRITE_DATES_WITH_CONTEXT_TIME_ZONE, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
如果我自动装配 ObjectMapper 并像
System.out.println(objectMapper.writeValueAsString(LocalDateTime.now()));
那样手动使用它,我会得到我想要的格式的日期。
但是我所有的控制器都不断生成这种格式的 json
2022-06-30T22:44:11
LocalDateTime
作为时间对象......
我缺少什么才能让它发挥作用?谢谢
尝试使用 @Primary 注释 objectMapper 配置。 下面的文章也提出了一些解决方案https://www.baeldung.com/spring-boot-customize-jackson-objectmapper。如果 @Primary 不起作用,请检查一下
在你的情况下,除了一件事之外,你一切都做得很好。
您正在添加自定义序列化器/解串器。但是您正在创建 Spring 已经存在的
ObjectMapper
的新实例。 Spring 有 ObjectMapper 的默认配置,它设置所有必要的序列化器/反序列化器和其他配置。您创建的 ObjectMapper 只有序列化器/反序列化器。 Spring 也使用其他的,但在你的实例中它们不存在。这就是为什么只使用默认值并自行配置而不是创建新的。
您的代码可能如下所示
@Configuration
public class DataTimeConfiguration {
@Bean
public ObjectMapper objectMapper(ObjectMapper mapper) {
var module = new JavaTimeModule();
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
mapper.registerModule(module);
return mapper;
}
public static class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException {
return LocalDateTime.parse(arg0.getText());
}
}
public static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
arg1.writeString(arg0.toString());
}
}
}