【问题标题】:spring-data-elasticsearch - Jackson can't serialize using global configurationspring-data-elasticsearch - Jackson 无法使用全局配置进行序列化
【发布时间】:2016-07-01 14:58:24
【问题描述】:

我正在使用 ElasticSearch 开发一个项目,但在使用 Jackson 进行序列化/反序列化时遇到了一些问题。我的项目是使用 JHipster 创建的,因此,我使用 spring 将我的实体存储到数据库并在 ElasticSearch 中建立索引。所有实体和其他对象都可以用杰克逊(反)序列化,除非我尝试将它添加到 ES。 这是我对 Jackson 的全局配置:

@Configuration
public class JacksonConfiguration {

    @Bean
    Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        SimpleModule timeModule = new JavaTimeModule();
        timeModule.addSerializer(OffsetDateTime.class, JSR310DateTimeSerializer.INSTANCE);
        timeModule.addSerializer(ZonedDateTime.class, JSR310DateTimeSerializer.INSTANCE);
        timeModule.addSerializer(LocalDateTime.class, JSR310DateTimeSerializer.INSTANCE);
        timeModule.addSerializer(Instant.class, JSR310DateTimeSerializer.INSTANCE);
        timeModule.addDeserializer(LocalDate.class, JSR310LocalDateDeserializer.INSTANCE);
        SimpleModule geoModule=new GeoModule();
        geoModule.addSerializer(Point.class, PointSerializer.INSTANCE);
        geoModule.addDeserializer(Point.class, PointDeserializer.INSTANCE);
        return new Jackson2ObjectMapperBuilder()
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .findModulesViaServiceLoader(true)
            .modulesToInstall(timeModule,geoModule);
    }
}

此配置工作正常,除非我尝试将实体添加到 ES,例如,PointSerializer 永远不会被调用。我可以看到此序列化程序为 ES 运行(并因此正确索引)的唯一方法是将 @JsonSerialize(using = PointSerializer.class) 添加到该字段。为什么会发生这种情况?如何全局配置?

【问题讨论】:

    标签: elasticsearch spring-boot jackson jhipster spring-data-elasticsearch


    【解决方案1】:

    似乎 Spring Data elasticsearch 没有为此使用默认的 spring Jackson2ObjectMapperBuilder。默认情况下使用此配置:

    https://github.com/spring-projects/spring-data-elasticsearch/blob/master/src/main/java/org/springframework/data/elasticsearch/core/DefaultEntityMapper.java

    ...您可以通过提供一些自定义对象映射器来覆盖它,如下所述:

    https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper

    在这里,您当然可以直接使用您的 Jackson ObjectMappers。有关更多详细信息,请查看 jhipster github repo 中的此问题:

    https://github.com/jhipster/generator-jhipster/issues/2241#issuecomment-151933768

    【讨论】:

    • 仅供参考:第一个链接已损坏,第二个链接已过时(他们不再使用 Jackson)
    猜你喜欢
    • 2017-07-21
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多