2017-09-14 72 views
2

我正在构建一个查询ElasticSearch的简单REST API。我没有使用ElasticSearch REST API方式,而是使用TCP方式。 我的目标是使用spring启动REST API,它将通过TCP与ElasticSearch通信。
我正在使用ElasticSearch服务器5.6
我有一个ElasticSearchClientFactory,其中包含与ElasticSearch服务器建立连接的代码。无法连接到弹性搜索

ElasticSearchClientFactory.java'buildClient

void buildClient() { 

     Settings settings = Settings.builder().put("cluster.name", elasticSearchProperties.getClusterName()).build(); 
     TransportClient transportClient = new PreBuiltTransportClient(settings); 
     if (!StringUtils.isEmpty(elasticSearchProperties.getHostname()) 
       && !StringUtils.isEmpty(elasticSearchProperties.getPort() + "")) { 

      try { 

       transportClient.addTransportAddress(
         new InetSocketTransportAddress(InetAddress.getByName(elasticSearchProperties.getHostname()), 
           elasticSearchProperties.getPort())); 

       transportClient.connectedNodes(); 

       this.client = transportClient; 

      } catch (UnknownHostException e) { 

       LOGGER.error("Unable to Connect to ElasticSearch,UnknownHost" + elasticSearchProperties.getHostname()); 
      } 
     } else { 

      LOGGER.error("Missing ElasticSearch configuration hostname and portNumber"); 
      throw new DataAccessException(CommonConstants.DAE001, "Unable to connect to ElasticSearch"); 
     } 

    } 

pom.xml中包含了以下相关ElasticSearch

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

    <dependency> 
     <groupId>org.elasticsearch.client</groupId> 
     <artifactId>transport</artifactId> 
     <version>5.5.2</version> 
    </dependency> 

    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.7</version> 
    </dependency> 

相关依赖性继服务器启动日志打印 -

2017-09-14 16:52:28:840 search org.springframework.boot.SpringApplication [main] ERROR - Application startup failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticSearchClientFactory' defined in file [D:\projects\verizon\mesh_workspace\search\target\classes\com\sapient\mesh\productlisting\config\ElasticSearchClientFactory.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive(ILjava/lang/String;)I 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:732) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) 
    at com.sapient.mesh.SearchApplication.main(SearchApplication.java:20) 
Caused by: java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive(ILjava/lang/String;)I 
    at io.netty.util.NettyRuntime$AvailableProcessorsHolder.setAvailableProcessors(NettyRuntime.java:44) 
    at io.netty.util.NettyRuntime.setAvailableProcessors(NettyRuntime.java:87) 
    at org.elasticsearch.transport.netty4.Netty4Utils.setAvailableProcessors(Netty4Utils.java:82) 
    at org.elasticsearch.transport.netty4.Netty4Transport.<init>(Netty4Transport.java:138) 
    at org.elasticsearch.transport.Netty4Plugin.lambda$getTransports$0(Netty4Plugin.java:93) 
    at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:174) 
    at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:265) 
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:130) 
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:116) 
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:106) 
    at com.sapient.mesh.productlisting.config.ElasticSearchClientFactory.buildClient(ElasticSearchClientFactory.java:62) 
    at com.sapient.mesh.productlisting.config.ElasticSearchClientFactory.afterPropertiesSet(ElasticSearchClientFactory.java:53) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579) 
    ... 16 common frames omitted 

回答

1

在java NoSuchMethodError通常会告诉你有多个同一个库的实例(或者你只有一个,但它是错误的)。 如果我是你,我会:

  • 检查行家树mvn dependency:tree -Dverbose。在树中,你将看到同一个库的2个实例(可能是2个不同的版本)。您需要手动从包含此lib作为依赖项的条目中排除pom.xml中的依赖项。那么有时候额外的lib可能来自server(例如glassfish)而不是maven,在这种情况下,请查看下面的内容。
  • 将一个断点设置为NettyRuntime.java:44,以调试模式连接,当您点击它时,评估错误库的路径。要评估路径,您需要询问lirary所在的classLoader。您可以执行此操作,以调试模式评估代码*。 (io.netty.util.internal.ObjectUtil class.getClassLoader()).getResource("io.netty.util.internal.ObjectUtil.class"))这将为您提供一个路径到库中,从这一点来说,你会知道你需要排除哪些地方从

* Evaluate codeEvaluate expression出来是应该可以在调试模式下在IDE的选项(Eclipse/Jetbrains/Netbeans或者你使用的应该支持它)