首页 文章

创建RestHighLevelClient bean时出现NoClassDefFoundError错误

提问于
浏览
2

我在SpringBoot应用程序中创建HighEndRestClient bean时遇到错误 . 我已经完成了一个测试'app',我检查了我可以实例化我想要的对象,然后拨打我想要的电话,现在我正在制作新的应用程序 .

我在pom中有这些依赖项

<dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>5.6.3</version>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>5.6.3</version>
    </dependency>

我已经在配置类中编写了这个非常基本的代码,但是这个代码没有做太多

@Configuration
@PropertySource(value = "classpath:application.properties")
@EnableElasticsearchRepositories(basePackages = "com.indexbuilder.es.repo")
public class ElasticsearchConfiguration {
    @Value("${elasticsearch.host}")
    private String EsHost;

    @Value("${elasticsearch.port}")
    private int EsPort;

    @Value("${elasticsearch.clustername}")
    private String EsClusterName;


    @Bean
    public RestClientBuilder coreBuilder() throws Exception {
        RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
        builder.setMaxRetryTimeoutMillis(10000);

        builder.setFailureListener(new RestClient.FailureListener() {
            @Override
            public void onFailure(HttpHost host) {
                System.out.println("FAILURE !!!! FailureListener HAS WOKEN UP!!!! CREATYE A FAILURE LISTENER BEAN" );
            }
        });

        return builder;
      }

    @Bean
    public RestClient restLowLevelClient() throws Exception{
        RestClient restClient = coreBuilder().build();
        return restClient;
    }

就我所见,这个工作正常(我还没有做太多...)

当我添加这个(最初我传入RestClient bean但现在我暂时创建一个本地对象以获得更清晰)

@Bean
    public RestHighLevelClient restHighLevelClient() throws Exception{
        RestClient restClient = coreBuilder().build();
        RestHighLevelClient client = new RestHighLevelClient(restClient);
        return client;
    }

我得到这个java.lang.NoClassDefFoundError错误

========= | _ | ============== | ___ / = /// _ / :: Spring Boot ::(v1.5.1.RELEASE)[警告]在sun.reflect.DeativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)中的java.lang.reflect.InvocationTargetException )at java.lang.ref.Modod.unvoke(Method.java:498)atg.springframework.boot.maven.AbstractRunMojo $ LaunchRunner.run(AbstractRunMojo.java:527)at java.lang.Thread.run(Thread . java:745)引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[com / indexbuilder / configuration / ElasticsearchConfiguration.class]中定义名称为'restHighLevelClient'的bean创建错误:通过工厂方法进行Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.elasticsearch.client.RestHighLevelClient]:工厂方法'restHighLevelClient'抛出异常;嵌套异常是org.springframework.beans.factory.support中的org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:598)中的java.lang.NoClassDefFoundError:org / elasticsearch / action / main / MainRequest . AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1140)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1034)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java: 525)在org.springframework的org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) . beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingl etonBeanRegistry.java:230)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)at org位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)的.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:744)org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:542)位于org.springframework的org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) . 在org.spring的org.springframework.boot.SpringApplication.run(SpringApplication.java:314)的boot.SpringApplication.refreshContext(SpringApplication.java:370) framework.boot.SpringApplication.run(SpringApplication.java:1162)位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)的com.indexbuilder.SpringBootStartUpConfig.main(SpringBootStartUpConfig.java:84)... 6更多由以下原因引起:org.springframework.beans.BeanInstantiationException:无法实例化[org.elasticsearch.client.RestHighLevelClient]:工厂方法'restHighLevelClient'抛出异常;嵌套异常是org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)中的java.lang.NoClassDefFoundError:org / elasticsearch / action / main / MainRequestorg.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:587)... 24更多引起:java.lang.NoClassDefFoundError:org / elasticsearch / action / main / MainRequest at com.indexbuilder.configuration . ElasticsearchConfiguration.restHighLevelClient(ElasticsearchConfiguration.java:95)at com.indexbuilder.configuration.ElasticsearchConfiguration $$ EnhancerBySpringCGLIB $$ 62f74d9a.CGLIB $ restHighLevelClient $ 1()at com.indexbuilder.configuration.ElasticsearchConfiguration $$ EnhancerBySpringCGLIB $$ 62f74d9a $$ FastClassBySpringCGLIB $$ 2位于org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)的b29ad7b.invoke()位于com.indexbuilder的org.springframework.context.annotation.ConfigurationClassEnhancer $ BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) . configuration.ElasticsearchConfiguration $$ EnhancerBySpringCGLIB $$ 62f74d9a.restHighLevelClient()at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at su n.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atg.springframework上的java.lang.reflect.Method.invoke(Method.java:498)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) .beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)... 25更多引起:java.lang.ClassNotFoundException:org.elasticsearch.action.main.MainRequest at java.net.URLClassLoader.findClass(URLClassLoader .java:381)java.lang.ClassLoader.loadClass(ClassLoader.java:424)java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 36更多

谁能指出我正确的方向?

2 回答

  • 5

    您可能还需要核心依赖项:

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.3</version>
    </dependency>
    

    NoClassDefFoundError 通常是配置错误 - 这意味着您使用的代码引用了某个类,但是类本身并不是您可以做的事情,除了可能提出问题 .

  • 0

    我有同样的问题 . ElasticSearch指向旧版本:

    org.elasticsearch:elasticsearch:6.2.3 -> 1.5.2
    

    我使用了dependencyManagement gradle插件来强制使用我提到的版本:

    dependencyManagement {
    dependencies {
        dependency 'org.elasticsearch:elasticsearch:6.2.3'
    }}
    

    欲了解更多信息:https://github.com/spring-gradle-plugins/dependency-management-plugin

相关问题