Spring Boot 如何全局添加一个自定义序列化器来格式化Sping Boot 中的所有即时值?

bn31dyow  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(124)

我尝试在DTO中全局格式化“即时”字段,因为我可以如下所示格式化其他日期字段:

@Configuration
public class AppConfig {
   
    private static final String DATE_TIME_FORMAT = "dd.MM.yyyy HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {

        return builder -> {
            builder.serializers(new LocalDateTimeSerializer(
                DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        };
    }
}

但是,我认为应该按照另一种方法创建新的bean,如下所示:

@Bean
ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configOverride(Instant.class)
            .setFormat(JsonFormat.Value.forPattern(DATE_TIME_FORMAT));
    return mapper;
}

它改变了我的即时值,但不是正确的格式:

"createdAt": {
            "nano": 0,
            "epochSecond": 1677445697
        }

那么,如何在我的Sping Boot 应用程序中正确管理它呢?

ccrfmcuu

ccrfmcuu1#

在此thread下,已针对类似情况回答了此问题。
但是,由于OP无法找到适当的修改,使其适用于他的情况,这里是解决方案,将在这里工作
正如注解中所述,这似乎不是最佳使用方式,因为转换为字符串时,您将不得不假设即时对象中不包含时区。

@Bean
public ObjectMapper registerObjectMapper(){
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule("MyInstantSerializer");
    module.addSerializer(Instant.class, new MyInstantSerializer());
    mapper.registerModule(module);
   
    return mapper;
}

然后你还需要

public class MyInstantSerializer extends JsonSerializer<Instant> {

    private static final String DATE_TIME_FORMAT = "dd.MM.yyyy HH:mm:ss";

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT).withZone(ZoneId.from(ZoneOffset.UTC));

    @Override
    public void serialize(
                    Instant value, 
                    JsonGenerator gen, 
                    SerializerProvider serializers) throws IOException {

        gen.writeString(formatter.format(value));

    }
}

相关问题