3

JodaTime を JSR310 に置き換えていますが、JodaTime() のモジュールは正常に機能していました。

spring-boot アプリケーションで日付のシリアル化を再構成しようとしています。

両方を保持できないため、日付を ISO 8601 にシリアライズ/デシリアライズする方法を探しています。

ここのアドバイスに従いましたが、これは役に立ちません: http://lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/

これは私JacksonConfig.javaのものobjectMapperです:

@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 はインスタンス化されますが、呼び出されることはserializeありdeserializeません。

JavaTimeModuleカスタムシリアライザー/デシリアライザーなしでも試しましたが、動作しません。

全く効果がないようです。

これをもう少しデバッグする方法はありますか?

私は spring-hateoas と spring-data を使用しています。関連する可能性のあるこの問題があります。

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

4

1 に答える 1

5

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;
}
于 2016-12-11T18:57:23.877 に答える