Spring Boot升级至2.2.0.RELEASE后Elasticsearch无法正常运行
问题根本原因
Spring Boot 2.2.0.RELEASE 配套的 Spring Data Elasticsearch 3.2.x 版本做了核心变更:
- 官方默认优先基于
RestHighLevelClient自动装配ElasticsearchRestTemplate - 原有基于
TransportClient实现的ElasticsearchTemplate不再默认自动注册到Spring容器,因为TransportClient已经被Elasticsearch官方标记为废弃,未来版本会彻底移除。
解决方案
方案一:沿用原有TransportClient逻辑(临时兼容,不推荐长期使用)
如果暂时不想改原有逻辑,手动开启TransportClient的自动配置即可:
- 在application.yml/application.properties中添加配置,启用TransportClient自动装配:
spring.data.elasticsearch.repositories.enabled=true # 替换为实际的ES集群地址、名称 spring.data.elasticsearch.cluster-nodes=ES节点IP:9300 spring.data.elasticsearch.cluster-name=ES集群名称
- 如果上述配置不生效,直接手动注册ElasticsearchTemplate Bean到容器,修改
CustomCdrElasticConfig类即可:
@Configuration public class CustomCdrElasticConfig { // 先构建TransportClient Bean @Bean public TransportClient elasticsearchClient() throws UnknownHostException { Settings settings = Settings.builder() .put("cluster.name", "你的集群名称") // 如有x-pack验证可添加下行配置 .put("xpack.security.user", "用户名:密码") .build(); TransportClient client = new PreBuiltXPackTransportClient(settings); client.addTransportAddress(new TransportAddress(InetAddress.getByName("ES节点IP"), 9300)); return client; } // 手动注册ElasticsearchTemplate @Bean public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException { return new ElasticsearchTemplate(elasticsearchClient()); } @Bean public CustomElasticsearchTemplate customElasticsearchTemplate() throws UnknownHostException { return new CustomElasticsearchTemplate(elasticsearchClient()); } }
方案二:迁移到RestHighLevelClient实现(官方推荐,长期方案)
直接替换原有ElasticsearchTemplate为ElasticsearchRestTemplate,改动量很小:
- 先确保application.yml/properties中配置了Rest客户端的相关参数:
spring.elasticsearch.rest.uris=http://ES节点IP:9200 # 有身份验证可添加下面两行 spring.elasticsearch.rest.username=用户名 spring.elasticsearch.rest.password=密码
- 修改
CustomCdrElasticConfig类代码:
@Configuration public class CustomCdrElasticConfig { @Autowired private RestHighLevelClient restHighLevelClient; @Bean public CustomElasticsearchTemplate customElasticsearchTemplate(){ // 若原有CustomElasticsearchTemplate仅支持TransportClient,需调整构造方法兼容RestHighLevelClient即可 return new CustomElasticsearchTemplate(restHighLevelClient); } }
注意:ElasticsearchRestTemplate的常用操作API和原有ElasticsearchTemplate基本一致,绝大多数业务代码不需要修改,仅需要调整依赖注入的类型即可。
内容的提问来源于stack exchange,提问作者Simarjit Singh
相关产品推荐
相关产品推荐

