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

时间:2018-10-27 21:24:48

标签: spring-boot elasticsearch

所以我试图让我的Spring Boot网络服务与Elasticsearch对话(我有另一个运行的Java应用程序)

我得到的错误是

  

DependencyException:创建名称为“ searchController”的bean时出错:   通过字段“ searchService”表示不满意的依赖关系;嵌套的   例外是   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为'searchService'的bean时出错:不满意的依赖关系   通过字段“ searchRepository”表示;嵌套异常为   org.springframework.beans.factory.BeanCreationException:错误   创建名称为“ searchRepository”的bean:初始化方法的调用   失败嵌套异常为   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信息1925-[[主要]   o.apache.catalina.core.StandardService:正在停止服务[Tomcat]

我的依存关系(等级)是

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\n"))
@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>
}

有人知道怎么了吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

对于那些尝试7.0的人,Spring Data Elasticsearch尚不支持它。

有关支持的弹性搜索版本,请参阅以下链接。

https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#preface.versions

替代方法:使用RestHighLevelClient和LowLevelClients进行交互。 JPA的功能将丢失。