spring - 在 Spring 使用 JSR310 java.time 时将日期、即时序列化为 ISO 8601

标签 spring serialization spring-boot jackson jsr310

我用 JSR310 替换 JodaTime,并且 JodaTime() 模块工作正常。

我正在尝试在 spring-boot 应用程序中重新配置日期的序列化。

我无法同时保留两者,因此我正在寻找一种将日期序列化/反序列化为 ISO 8601 的方法。

我遵循了这里的建议,但这没有帮助: http://lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/

这是我的 JacksonConfig.javaobjectMapper:

@Configuration
public class JacksonConfig extends RepositoryRestMvcConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(JacksonConfig.class);
    public static final DateTimeFormatter FORMATTER = ofPattern("dd::MM::yyyy");

    @Bean
    // Override and Primary due to bug: https://github.com/spring-projects/spring-boot/issues/6529
    @Override
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
        mapper.registerModule(javaTimeModule);
        return mapper;
    }

    public class LocalDateSerializer extends JsonSerializer<LocalDate> {
        @Override
        public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(value.format(FORMATTER));
        }
    }
    public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
        @Override
        public LocalDate deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
            return LocalDate.parse(p.getValueAsString(), FORMATTER);
        }
    }
}

bean 被实例化,但 serializedeserialize 永远不会被调用。

我还尝试了没有自定义序列化器/反序列化器的JavaTimeModule,它也不起作用。

好像完全没有效果。

有没有办法进一步调试这个问题?

我正在使用 spring-hateoas 和 spring-data,我有一个可能相关的问题:

https://github.com/spring-projects/spring-hateoas/issues/333

最佳答案

利用java time模块中提供的ser/deser。这实际上是使用自定义格式化程序设置它们。

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;

public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    LocalDateSerializer localDateSerializer = new LocalDateSerializer(FORMATTER);
    javaTimeModule.addSerializer(LocalDate.class, localDateSerializer);
    LocalDateDeserializer localDateDeserializer = new LocalDateDeserializer(FORMATTER);
    javaTimeModule.addDeserializer(LocalDate.class, localDateDeserializer);
    mapper.registerModule(javaTimeModule);
    return mapper;
}

关于spring - 在 Spring 使用 JSR310 java.time 时将日期、即时序列化为 ISO 8601,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089005/

相关文章:

java - spring boot 到 mysql docker 通信

java - Spring Data Rest 事务边界

symfony - 自定义规范器未通过名称转换器服务

.net - Protocol Buffer : Should I use int64 or fixed64 to represent a . NET DateTime 值?

java - Thymeleaf 内容助手无法与 Spring Boot 一起使用

java - 如何将List转换为Map并使Map成为对象属性的关键

java - Spring安全配置requestMatchers.hasRole()总是给出403禁止状态

java - spring boot中的共享gradle项目不包含yml文件

spring - 错误 : getWriter() has already been called for this response in springmvc

delphi - 二进制序列化文件 - Delphi