我正在使用ElasticSearch开发一个项目,我在与Jackson的序列化/反序列化方面遇到了一些问题。我的项目是使用JHipster创建的,因此,我使用spring将我的实体存储到数据库并在ElasticSearch中编制索引。所有实体和其他对象都可以与杰克逊(de)序列化,除非我尝试将其添加到ES。 这是我对杰克逊的全球配置:
@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)
。为什么会发生这种情况?如何在全球范围内进行配置?
答案 0 :(得分:3)
Spring Data elasticsearch似乎没有使用默认的弹簧Jackson2ObjectMapperBuilder
。默认情况下,使用此配置:
...您可以通过提供一些自定义对象映射器来覆盖,如下所述:
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