Spring Boot连接Elasticsearch集群报错:Bean创建失败(ES 6.2.0)
解决Spring Boot连接Elasticsearch 6.2.0时的BeanCreationException问题
我之前踩过ES 6.2.0和Spring Boot搭配的坑,看到你这个BeanCreationException,大概率是版本匹配或者客户端配置的问题,咱们一步步来排查解决:
1. 先确认依赖版本完全对齐
ES 6.2.0对依赖版本要求很严格,必须保证spring-data-elasticsearch、elasticsearch核心包、transport客户端三者版本完全一致,而且要和你的Spring Boot版本兼容:
- ES 6.2.0对应的spring-data-elasticsearch版本是3.1.x(比如3.1.4.RELEASE)
- 如果你的Spring Boot版本是2.0.x,它默认带的spring-data-elasticsearch是3.0.x(对应ES 5.x),所以必须手动覆盖版本,还要排除默认的冲突依赖。
举个pom.xml的正确配置例子:
<!-- Spring Boot ES starter 排除默认的ES依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> </exclusion> </exclusions> </dependency> <!-- 手动引入对应版本的ES核心包和transport客户端 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.2.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.2.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>3.1.4.RELEASE</version> </dependency>
2. 修正ElasticsearchConfig的客户端创建逻辑
ES 6.x的TransportClient创建方式和后续版本不一样,不能用RestHighLevelClient(那是7.x以后的主流),得用PreBuiltTransportClient,并且正确配置集群信息:
@Configuration public class ElasticSearchConfig { @Bean public Client client() throws UnknownHostException { // 如果你的ES集群名称不是默认的"elasticsearch",一定要在这里配置 Settings settings = Settings.builder() .put("cluster.name", "your-cluster-name") // 可选:如果开启了x-pack认证,还要加账号密码 // .put("xpack.security.user", "elastic:your-password") .build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)); // 如果是多节点集群,继续addTransportAddress即可 // .addTransportAddress(new TransportAddress(InetAddress.getByName("node2"), 9300)); return client; } }
注意哈:ES 6.2.0的transport端口默认是9300,不是9200(那是REST端口),别搞混了!
3. 排查集群配置和依赖冲突
- 检查ES集群的
elasticsearch.yml:确保transport.tcp.port是9300,cluster.name和你客户端配置的一致,而且节点之间的通信正常 - 用
mvn dependency:tree(Maven)或者./gradlew dependencies(Gradle)查看依赖树,看看有没有其他依赖悄悄引入了不同版本的ES包,比如logstash、其他监控工具,如果有,一定要排除掉对应的冲突依赖
4. 查看完整的嵌套异常信息
你贴的错误截断了,后面的nested exception才是关键!比如如果是NoClassDefFoundError: org/elasticsearch/common/transport/TransportAddress,那就是依赖缺失;如果是IllegalStateException: failed to obtain node locks,那可能是ES集群的文件权限问题。把完整的异常栈贴出来,能更快定位问题。
按照上面的步骤调整,大概率能解决这个Bean创建失败的问题。
内容的提问来源于stack exchange,提问作者user420840
相关产品推荐
相关产品推荐

