elasticsearch - java.lang.NoSuchMethodError : org. elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.setSource

标签 elasticsearch pom.xml spring-data-elasticsearch parent-pom

我正在尝试运行使用子项目的 Spring Boot 父项目,该子项目又使用具有 Elasticsearch 依赖项的项目(ES 项目)和用于传输客户端的 Elasticsearch 配置 bean。
子项目使用 Spring Data ES 存储库,这些存储库由项目中的相应注释启用。
这些是子级中使用的配置注释:

@Configuration
@ComponentScan("package")
@EntityScan("package3")
@EnableJpaRepositories("package2")
// enables only es repos for current project, ESProject has this annotation for its packages respectively
@EnableElasticsearchRepositories("package1")

父项目在 ES 项目和子项目的所有包上都有唯一的 @SPringBootApplication。

父pom:
<dependencies>
        <dependency>
            <groupId>org.groupid</groupId>
            <artifactId>ChildProject</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
        </dependency>
   <!-- ... -->
</dependencies>

child 绒球:
<dependencies>
        <dependency>
            <groupId>org.groupid</groupId>
            <artifactId>ESProject </artifactId>
            <version>1.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <!-- exclusions -->
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
        </dependency>
</dependencies>

ESProject Pom:
   <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.4.1</version>                    
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.1.1.RELEASE</version>            
        </dependency>
   </dependencies> 

父项目是pom的一个模块,使用的是Spring Boot 2.0.5.RELEASE。

当我运行父项目时,我得到了这个。显然存在一些依赖冲突,但我无法弄清楚它们。
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.NumberKeyedRepository]: Constructor threw exception; 

  nested exception is java.lang.NoSuchMethodError: org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.setSource(Ljava/lang/String;)Lorg/elasticsearch/action/admin/indices/mapping/put/PutMappingRequestBuilder;

另外,值得注意的是,如果我在其他项目中使用 ESProject,我没有得到这个异常(exception),但我在这些项目中没有 Spring Data ES Repos。

最佳答案

您的设置中有相当多的 Spring Data Elasticsearch 和 Elasticsearch 库版本。让我试着想象一下我们得到了什么:

Spring Boot 2.0.5 
  +- Elasticsearch                  5.6.11
  +- Data Kay.SR10
    +- Spring Data Elasticsearch    3.0.10
      +- Elasticsearch              5.5.0   

Boot 2.0.5 引入了 ES 5.6.11,但同时通过 ES 的 Spring Data Kay releasetrain 版本 5.5.0 和 SDES 的 3.0.10(这不是很好,但应该可以工作)。
Spring Data Elasticsearch   3.1.1
  +- Elasticsearch          6.2.2

您定义依赖于 ES 6.2.2 的 SDES 3.1.1
Elasticsearch               6.4.1

最后,您将 ES 版本定义为 6.4.1

至于您看到的错误:您的应用程序使用的代码需要在 ES 客户端库中提供以下函数(使用类型的完全限定名称):
org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.setSource(java.lang.String)

此方法存在于 ES 5.5 中,但已被弃用(摘自代码):
    /**
     * The mapping source definition.
     * @deprecated use {@link #setSource(String, XContentType)}
     */
    @Deprecated
    public PutMappingRequestBuilder setSource(String mappingSource) {
        request.source(mappingSource);
        return this;
    }


在 ES6 中,这个方法被移除了,只有一个带有额外的 XContentType 的方法。参数存在 - SDES 用于此版本。

因此,您的应用程序将 SDES 3.0 与无法工作的 ES 6 库一起加载。

因此,您应该使用 Boot 2.1 或 2.2 check the version matrix here 将依赖项更新到一致的版本。

关于elasticsearch - java.lang.NoSuchMethodError : org. elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.setSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62287683/

相关文章:

elasticsearch - 导出/导入 Kibana 4 保存的搜索、可视化和仪表板

java - 我如何从另一个模块 maven 导入类

java - 如何使用spring data在elasticsearch中根据结果的最高精度对数据进行排序

java - Elasticsearch 建模最佳实践

elasticsearch - 获取每天发生的日期直方图

elasticsearch - 使用AND运算符在Elastic Search中搜索

java - 用于文本分析的Elasticsearch Analyzers

java - Maven 找不到某些依赖项的组件

java - Maven 属性的约定 : "dot case" or "camel case"?

java - Elasticsearch spring数据中useServerConfiguration()和createIndex()的含义