ObjectMapper 在 Spring Java 上配置 GLOBAL LocalDateTime

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

我正在尝试实现一些非常简单的事情,即将全局时间格式设置为 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

我所有的实体和 Dtos 都使用
LocalDateTime
作为时间对象...... 我缺少什么才能让它发挥作用?
请不要建议注释我所有的 LocalDateTime 来设置模式,我想要一个可以全局设置的配置

谢谢

spring jackson java-time jackson-modules
2个回答
0
投票

尝试使用 @Primary 注释 objectMapper 配置。 下面的文章也提出了一些解决方案https://www.baeldung.com/spring-boot-customize-jackson-objectmapper。如果 @Primary 不起作用,请检查一下


0
投票

在你的情况下,除了一件事之外,你一切都做得很好。

您正在添加自定义序列化器/解串器。但是您正在创建 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());
    }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.