Elasticsearch Java API Client响应解码失败问题求助
解决Elasticsearch Java API Client反序列化Java 8 OffsetDateTime报错问题
问题描述
搭建新版Elasticsearch Java API Client时,搜索请求可成功发送,但响应处理出现反序列化错误,核心报错信息:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.OffsetDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
解决方案
1. 添加Jackson JSR310依赖
根据项目构建工具,添加jackson-datatype-jsr310依赖,版本需与项目中已有Jackson版本保持一致:
Maven(pom.xml)
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>${jackson.version}</version> </dependency>
Gradle(build.gradle)
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jacksonVersion}"
2. 配置JacksonJsonpMapper并注册日期模块
修改Elasticsearch Client配置代码,自定义ObjectMapper并注册JavaTimeModule,再传入JacksonJsonpMapper:
// Set up elasticsearch cluster hosts String[] elasticsearchHosts = elasticsearchEndpoints.split(","); HttpHost[] httpHosts = Arrays.stream(elasticsearchHosts) .map(HttpHost::create).toArray(HttpHost[]::new); // Create the low level client final RestClientBuilder restClientbuilder = RestClient.builder(httpHosts); // Set elasticsearch user credentials final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); restClientbuilder.setHttpClientConfigCallback( b -> b.setDefaultCredentialsProvider(credentialsProvider)); RestClient restClient = restClientbuilder.build(); // 自定义ObjectMapper,注册Java 8日期模块 ObjectMapper objectMapper = new ObjectMapper() .registerModule(new JavaTimeModule()) // 可选:禁用时间戳序列化,使用ISO-8601字符串格式,与ES默认兼容 .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 使用自定义ObjectMapper创建JacksonJsonpMapper JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(objectMapper); // Create the transport with configured mapper ElasticsearchTransport transport = new RestClientTransport(restClient, jsonpMapper); return new ElasticsearchClient(transport);
说明
JavaTimeModule是jackson-datatype-jsr310提供的模块,专门支持Java 8的java.time系列日期时间类型(包括OffsetDateTime)。- 禁用
WRITE_DATES_AS_TIMESTAMPS可让Jackson以ISO字符串格式处理日期,与Elasticsearch默认的日期存储格式保持一致,避免格式不匹配问题。
内容的提问来源于stack exchange,提问作者Murat K.
相关产品推荐
相关产品推荐

