Elasticsearch和Java Spring Boot:java.lang.NoSuchMethodError:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch和Java Spring Boot:java.lang.NoSuchMethodError:相关的知识,希望对你有一定的参考价值。

所以我试图让我的Spring Boot Web服务与Elasticsearch交谈(我有另一个可行的Java应用程序)

我得到的错误是

DependencyException:创建名为'searchController'的bean时出错:通过字段'searchService'表示的不满意的依赖关系;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为'searchService'的bean时出错:通过字段'searchRepository'表示的不满意的依赖关系;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'searchRepository'的bean时出错:init方法的调用失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]:构造函数抛出异常;嵌套异常是java.lang.NoSuchMethodError:org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.execute()Lorg / elasticsearch / action / ListenableActionFuture; 2018-10-27 22:18:49.139 INFO 1925 --- [main] o.apache.catalina.core.StandardService:停止服务[Tomcat]

我的依赖(Gradle)是

compile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '6.4.2'
    compile group: 'org.elasticsearch.client', name: 'transport', version: '6.4.2'
    compile 'org.elasticsearch:elasticsearch:6.4.2'
    compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')

我的模特

@org.springframework.data.elasticsearch.annotations.Document(indexName = "burf", type = "pages")
data class Result(@Id val handle: String,
                  val url: String,
                  val title: String,
                  val body: String,
                  val meta_description: String?) {

}

配置

@Configuration
@EnableElasticsearchRepositories(basePackages = arrayOf("com.burfdevelopment.skynet.repository
"))
@ComponentScan(basePackages = arrayOf("com.burfdevelopment.skynet.service"))
class Config {

    @Value("${elasticsearch.home:/usr/local/Cellar/elasticsearch}")
    private val elasticsearchHome: String? = null

    @Value("${elasticsearch.cluster.name:skynet}")
    private val clusterName: String? = null

    @Bean
    fun client(): Client {
        val settings = Settings.builder()
                .put("cluster.name", clusterName).build()

        return PreBuiltTransportClient(settings).addTransportAddress(TransportAddress(InetAddress.getByName("192.168.0.100"), 9300))
    }

    @Bean
    fun elasticsearchTemplate(): ElasticsearchOperations {
        return ElasticsearchTemplate(client())
    }
}

知识库

interface SearchRepository : ElasticsearchRepository<Result, String>  {

    fun findByTitle(name: String, pageable: Pageable): Page<Result>
}

任何人都知道什么是错的?

答案

您正在使用的Spring Boot版本使用与Elasticsearch 6.4不兼容的Spring Data Elasticsearch版本。

要确保使用兼容版本,请从Elasticsearch依赖项中删除该版本,并允许Spring Boot的依赖关系管理来控制版本。

以上是关于Elasticsearch和Java Spring Boot:java.lang.NoSuchMethodError:的主要内容,如果未能解决你的问题,请参考以下文章

JAVA spring (JPA) 中的PostgreSQL + Elasticsearch 同步

Spring Data Elasticsearch

ElasticSearch 7.3 结合Spring boot进行增删改查和批量(bulk)详解

通过 Java/Spring Boot 连接到 Docker Elasticsearch 实例

SprignBoot整合Spring Data Elasticsearch

Java之Spring Data Elasticsearch一篇文章从入门到实战