Spring Boot 3.0.x升级后Elasticsearch Content-Type头兼容问题求助
Spring Boot 3.0.x 对接 Elasticsearch 7.9.3 报 Content-Type 不支持错误的解决办法
问题描述
将Spring Boot从2.6.9升级至3.0.0后,对接Elasticsearch 7.9.3时触发以下错误:
Caused by: org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=exception, reason=Content-Type header [application/vnd.elasticsearch+json; compatible-with=7] is not supported]
版本信息
升级前
- Spring Boot版本:2.6.9
- spring-boot-starter-data-elasticsearch:2.6.9
- spring-data-elasticsearch:4.4.0
- elasticsearch-rest-high-level-client:7.17.3
- Elasticsearch服务端版本:7.9.3
升级后
- Spring Boot版本:3.0.0
- spring-boot-starter-data-elasticsearch:3.0.0
- spring-data-elasticsearch:5.0.0
- elasticsearch-rest-high-level-client:7.17.3
- Elasticsearch服务端版本:7.9.3
原因分析
Spring Data Elasticsearch 5.0.0(对应Spring Boot 3.0)默认使用的客户端会发送application/vnd.elasticsearch+json; compatible-with=7格式的Content-Type请求头,但Elasticsearch 7.9.3版本不支持该媒体类型,导致请求被拒绝。
解决方案
方案1:升级Elasticsearch服务端至7.17.x版本
这是官方推荐的最优解,Spring Data Elasticsearch 5.0.0设计时默认匹配Elasticsearch 7.17.x版本,版本对齐后可彻底解决协议兼容问题,同时能获得ES新版本的特性和稳定性修复。
方案2:自定义客户端强制修改Content-Type头
若暂时无法升级ES服务端,可通过配置类强制客户端发送ES 7.9.3支持的application/json头:
import org.apache.http.HttpHeaders; import org.apache.http.entity.ContentType; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; @Configuration public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @Override public RestClientBuilder restClientBuilder() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") // 替换为你的Elasticsearch地址 .withClientConfigurer(clientConfigurer -> clientConfigurer.withHttpClientConfigurer(httpClientBuilder -> httpClientBuilder.addInterceptorFirst((request, context) -> { // 替换默认Content-Type为application/json request.removeHeaders(HttpHeaders.CONTENT_TYPE); request.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()); return context.proceed(request); }) )) .build(); return RestClients.create(clientConfiguration).getRestClient().getHttpClient().getBuilder(); } @Bean @Override public RestClient elasticsearchClient() { return restClientBuilder().build(); } }
方案3:降级Spring Data Elasticsearch版本(不推荐)
若不愿修改代码或升级ES服务端,可临时将spring-boot-starter-data-elasticsearch降级至与ES 7.9.3兼容的版本,但此方法会丢失Spring Boot 3.0的部分特性,且可能引发其他依赖兼容问题,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Uday Patil
相关产品推荐
相关产品推荐

