java.lang.NoSuchMethodError: org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.setSource
java.lang.NoSuchMethodError: org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder.setSource
我正在尝试 运行 使用 child 项目的 spring 启动 parent 项目,该项目又使用具有 elasticsearch 依赖项的项目(ES 项目)和用于传输客户端的 elasticsearch 配置 bean。
child 项目使用 Spring Data ES 存储库,这些存储库由项目中的相应注释启用。
这些是 child:
中使用的配置注释
@Configuration
@ComponentScan("package")
@EntityScan("package3")
@EnableJpaRepositories("package2")
// enables only es repos for current project, ESProject has this annotation for its packages respectively
@EnableElasticsearchRepositories("package1")
parent 项目在 ES 项目的所有包上有唯一的@SPringBootApplication,child 有一个。
Parent 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 pom:
<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>
parent工程是pom的模块,使用SpringBoot 2.0.5.RELEASE.
当我 运行 一个 parent 项目时,我得到了这个。显然存在一些依赖冲突,但我不太明白它们。
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,我不会遇到此异常,但我在这些项目中没有 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,但同时通过 Spring Data Kay releasetrain ES 的 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
我正在尝试 运行 使用 child 项目的 spring 启动 parent 项目,该项目又使用具有 elasticsearch 依赖项的项目(ES 项目)和用于传输客户端的 elasticsearch 配置 bean。
child 项目使用 Spring Data ES 存储库,这些存储库由项目中的相应注释启用。
这些是 child:
@Configuration
@ComponentScan("package")
@EntityScan("package3")
@EnableJpaRepositories("package2")
// enables only es repos for current project, ESProject has this annotation for its packages respectively
@EnableElasticsearchRepositories("package1")
parent 项目在 ES 项目的所有包上有唯一的@SPringBootApplication,child 有一个。
Parent 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 pom:
<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>
parent工程是pom的模块,使用SpringBoot 2.0.5.RELEASE.
当我 运行 一个 parent 项目时,我得到了这个。显然存在一些依赖冲突,但我不太明白它们。
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,我不会遇到此异常,但我在这些项目中没有 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,但同时通过 Spring Data Kay releasetrain ES 的 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