首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Data ES迁移后: IllegalArgumentException: NamedWriteable已注册[...],无法注册[...]

Spring Data ES迁移后: IllegalArgumentException: NamedWriteable已注册[...],无法注册[...]
EN

Stack Overflow用户
提问于 2019-10-22 16:22:40
回答 1查看 135关注 0票数 0

我有一个spring应用程序(它是spring发现集群的一部分,作为发现客户端)。我们选择将这个应用程序从spring data elasticsearch 2.1.1.RELEASE (链接到dockerise 2.4.3-高山elasticsearch)迁移到SDE 3.0.14.RELEASE (如果我没记错的话,可以链接到dockerise ES 5.5.0-高山)。我的问题是,这个应用程序从来没有实现启动。

注意:在迁移之前,它工作得很好

首先,我认为这是maven依赖关系的问题,所以我试图找到重复的依赖关系,但没有结果。我还尝试使用自己的TransportClient (带有擦除应用程序属性以防止spring自动配置),就像Elasticsearch文档所描述的那样(但显然,spring应该能够自己做这件事)。

下面是主类(带有一些可能有用的spring注释):

代码语言:javascript
复制
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableConfigurationProperties
@Configuration
@EnableElasticsearchRepositories(basePackages = {"com.sap.testreportservice"}, repositoryBaseClass = ApplicationRepositoryImpl.class)
public class TestreportServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestreportServiceApplication.class, args);
    }
}

下面是它的maven依赖项:

代码语言:javascript
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        <version>1.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-hystrix-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.0.14.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

以下是一些应用程序的属性:

代码语言:javascript
复制
spring:
  data:
    elasticsearch:
      cluster-name: ${ES_CLUSTER_NAME:insights}
      cluster-nodes: ${ES_CLUSTER_NODES:localhost:9300}

下面是我的自定义传输客户端:

代码语言:javascript
复制
@Configuration
public class ElasticsearchConfig {

    @Bean
    Client client() {
        Settings settings = Settings.builder()
                .put("cluster.name", "insights")
                .build();
        TransportClient client = new PreBuiltTransportClient(settings);
        try {
            client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return client;
    }
}

下面是一些日志摘录(向我索要完整的堆栈跟踪)

代码语言:javascript
复制
Caused by: java.lang.IllegalArgumentException: NamedWriteable [org.elasticsearch.index.query.QueryBuilder][parent_id] is already registered for [org.elasticsearch.search.SearchModule$$Lambda$942/734191650], cannot register [org.elasticsearch.join.ParentJoinPlugin$$Lambda$952/956934228]
    at org.elasticsearch.common.io.stream.NamedWriteableRegistry.<init>(NamedWriteableRegistry.java:91) ~[elasticsearch-5.5.0.jar:5.5.0]
    at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:148) ~[elasticsearch-5.5.0.jar:5.5.0]
    at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:254) ~[elasticsearch-5.5.0.jar:5.5.0]
    at org.springframework.data.elasticsearch.client.TransportClientFactoryBean$SpringDataTransportClient.<init>(TransportClientFactoryBean.java:234) ~[spring-data-elasticsearch-3.0.14.RELEASE.jar:3.0.14.RELEASE]
    at org.springframework.data.elasticsearch.client.TransportClientFactoryBean.buildClient(TransportClientFactoryBean.java:103) ~[spring-data-elasticsearch-3.0.14.RELEASE.jar:3.0.14.RELEASE]
    at org.springframework.data.elasticsearch.client.TransportClientFactoryBean.afterPropertiesSet(TransportClientFactoryBean.java:98) ~[spring-data-elasticsearch-3.0.14.RELEASE.jar:3.0.14.RELEASE]
    at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration.elasticsearchClient(ElasticsearchAutoConfiguration.java:59) ~[spring-boot-autoconfigure-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration$$EnhancerBySpringCGLIB$$151bff6d.CGLIB$elasticsearchClient$0(<generated>) ~[spring-boot-autoconfigure-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration$$EnhancerBySpringCGLIB$$151bff6d$$FastClassBySpringCGLIB$$575694c9.invoke(<generated>) ~[spring-boot-autoconfigure-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration$$EnhancerBySpringCGLIB$$151bff6d.elasticsearchClient(<generated>) ~[spring-boot-autoconfigure-2.1.7.RELEASE.jar:2.1.7.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    ... 145 common frames omitted
EN

回答 1

Stack Overflow用户

发布于 2019-10-23 02:37:51

这些都是您要升级到的非常旧的版本。

查看堆栈跟踪,您会看到Spring Boot仍在自动创建TransportClient,如果您希望提供自己的bean,则应该将代码更改为:

代码语言:javascript
复制
@Bean
TransportClient elasticsearchClient() {
    Settings settings = Settings.builder()
            .put("cluster.name", "insights")
            .build();
    TransportClient client = new PreBuiltTransportClient(settings);
    try {
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    return client;
}

Spring Boot自动配置在它的工厂方法上有一个@ConditionalOnMissingBean注释,它检查TransportClient,而不是Client。这样,您将提供TransportClient,但Spring Boot将完成其余的自动配置。

要禁用Elasticsearch的自动配置,您可以使用@SpringBootApplication(exclude={ElasticsearchAutoConfiguration.class})

您的配置中是否有elasticsearch插件配置?因为您看到的错误来自这样一个事实,即自动配置尝试构建的客户端希望注册ParentJoinPlugin(这是在该版本的TransportClientFactoryBean中硬编码的,并且已经注册了一个冲突条目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58499943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档