spring boot 整合 es 報錯

概述

最近因爲一些緣由須要升級 spring boot 版本,項目原來的版本是 spring boot 2.1.2.RELEASE,如今把版本升級到 spring boot 2.4.1,項目一啓動就報以下錯誤,經過查閱官方文檔,一步一步解決了這個問題,在這裏記錄一下,但願對遇到一樣問題的小夥伴提供一些幫助。html

說明:我使用的 elasticsearch 的版本是 6.7.0

升級spring boot 版本後報錯以下

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticsearchTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataConfiguration$RestClientConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate]: Factory method 'elasticsearchTemplate' threw exception; nested exception is java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: org/elasticsearch/client/core/MainResponse
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.2.jar:5.3.2]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.1.jar:2.4.1]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.1.jar:2.4.1]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.1.jar:2.4.1]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.1.jar:2.4.1]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) [spring-boot-2.4.1.jar:2.4.1]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) [spring-boot-2.4.1.jar:2.4.1]
    at com.southcn.nfplus.NfplusEsSearchApplication.main(NfplusEsSearchApplication.java:10) [classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate]: Factory method 'elasticsearchTemplate' threw exception; nested exception is java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: org/elasticsearch/client/core/MainResponse
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.2.jar:5.3.2]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.2.jar:5.3.2]
    ... 20 common frames omitted
Caused by: java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: org/elasticsearch/client/core/MainResponse
    at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.getClusterVersion(ElasticsearchRestTemplate.java:373) ~[spring-data-elasticsearch-4.1.2.jar:4.1.2]
    at org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate.initialize(AbstractElasticsearchTemplate.java:95) ~[spring-data-elasticsearch-4.1.2.jar:4.1.2]
    at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.<init>(ElasticsearchRestTemplate.java:116) ~[spring-data-elasticsearch-4.1.2.jar:4.1.2]
    at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataConfiguration$RestClientConfiguration.elasticsearchTemplate(ElasticsearchDataConfiguration.java:74) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.2.jar:5.3.2]
    ... 21 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/elasticsearch/client/core/MainResponse
    ... 30 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.client.core.MainResponse
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_131]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_131]
    ... 30 common frames omitted

緣由分析

查看spring data elasticsearch 官網: Spring Data Elasticsearch 4.2.0 官方文檔

有以下版本說明:
image.pngjava

咱們還能夠查看 spring-boot-dependencies: 2.4.1spring-boot-dependencies: 2.1.2.RELEASE 的 pom.xml 文件,搜索 elasticersearch 的版本,能夠看到以下圖所示的默認版本號:web

image.png
image.png

從上面的分析咱們能夠知道,默認狀況下:
spring boot 2.1.2.RELEASE 對應的 elasticsearch 版本是 6.4.3, 對應的 spring data elsaticsearch 3.1.x;
spring boot 2.4.1 對應的 elasticsearch 版本是 7.9.3, 對應的 spring data elsaticsearch 4.1.x;
因此咱們能夠知道,因爲版本不兼容致使上面的報錯,一個主要的緣由是 elasticsearch 6.x 和 elasticsearch 7.x 存在版本不兼容的問題。spring

解決方法

從上面的分析咱們已經知道是版本不兼容致使的問題,因此咱們只須要手動修改成咱們須要的版本便可解決此問題。
由於我這裏使用的 elasticsearch 的版本是 6.7.0 , 因此須要指定 spring data elasticsearch 的版本兼容對應的 elasticsearch 版本便可。elasticsearch

項目中原來的依賴以下(只列出es相關依賴),沒有指定版本號,使用的是默認的版本號:spring-boot

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>

修改成以下的配置,即手動指定須要的版本號:ui

<properties>
        <spring.data.elasticsearch.version>3.2.1.RELEASE</spring.data.elasticsearch.version>
        <elasticsearch.version>6.7.0</elasticsearch.version>
</properties>
<dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>${spring.data.elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
</dependencies>

經過上面的配置以後,再次啓動項目,項目能夠正常啓動了。spa

相關文章
相關標籤/搜索