You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:30:43