【问题标题】:Spring elasticsearch java.net.UnknownHostException春季弹性搜索 java.net.UnknownHostException
【发布时间】:2020-04-29 07:57:17
【问题描述】:

尝试更新一个小型实验性 Spring Elasticsearch 项目以反映 3.2.6 版本中的更改reference guide

如前所述:TransportClient 自 Elasticsearch 7 起已弃用,并将在 8 中删除。尝试重新配置为 High Level Rest Client

但出现以下错误

    Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'elasticDatasource' defined in file [/Users/erichuang/Desktop/JE/00-Development/dev/lab/lab-elastic-search/lab-elastic-search/target/classes/com/elastic/labelasticsearch/config/ElasticDatasource.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carElasticRepo': Invocation of init method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: Constructor threw exception; nested exception is org.springframework.data.elasticsearch.ElasticsearchException: Error while for indexExists request: org.elasticsearch.action.admin.indices.get.GetIndexRequest@b5d8ebb
    org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
    com.elastic.labelasticsearch.LabElasticSearchApplication.main(LabElasticSearchApplication.java:15)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carElasticRepo': Invocation of init method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: Constructor threw exception; nested exception is org.springframework.data.elasticsearch.ElasticsearchException: Error while for indexExists request: org.elasticsearch.action.admin.indices.get.GetIndexRequest@b5d8ebb
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)

    ... 24 common frames omitted

Caused by: java.net.UnknownHostException: localhost/<unresolved>: nodename nor servname provided, or not known
at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:932)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1505)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:851)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1495)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1354)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1288)
...
... 63 common frames omitted

旧设置(有效)

ElasticSearchConfig

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.elastic.labelasticsearch.repo")
public class ElasticSearchConfig  {
    private static final String esHost = "localhost";
    private static final int esPort = 9300;

    @Bean
    public Client client() throws UnknownHostException {
        var transportClient = new PreBuiltTransportClient(Settings.EMPTY);
        transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(esHost), esPort));

        return transportClient;
    }

    @Bean(name ={"elasticsearchOperations", "elasticsearchTemplate"})
    public ElasticsearchOperations esTemplate() throws UnknownHostException {
        return new ElasticsearchTemplate(client());
    }

    @Bean
    public RestTemplate restTemplate(){
       return new RestTemplate();
    }

}

新设置

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.elastic.labelasticsearch.repo")
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {

        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9300")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }

}

我错过了什么?

【问题讨论】:

    标签: spring-data-elasticsearch


    【解决方案1】:

    这是由于 Java 14 中 java.net.InetSocketAddress.toString() 方法的更改而导致的错误。这已在 4.0.RC2(昨天发布)中修复。

    编辑:我也会将其反向移植到 3.2 分支中

    【讨论】:

    • 候选版本未发布到 maven Central,您需要从发布存储库中获取它(请参阅docs.spring.io/spring-data/elasticsearch/docs/4.0.0.RC2/…
    • 此修复程序适用于哪些版本?我一直在等待这个,所以我们可以从现在不受支持的 JDK13 迁移到 JDK14
    • 在 4.0.0.RELEASE 中,它将在 3.2.8.RELEASE 中
    【解决方案2】:

    您需要使用这种方式来配置您的 bean,以允许分离所使用的主机端口和 http 协议:

    @Configuration
    @EnableElasticsearchRepositories(basePackages = "*")
    public class ElasticsearchClientConfig {
    
        @Value("${elasticsearch.host}")
        private String host;
    
        @Value("${elasticsearch.port}")
        private int port;
    
        @Value("${elasticsearch.protocol}")
        private String protocol;
    
        @Value("${elasticsearch.username}")
        private String userName;
    
        @Value("${elasticsearch.password}")
        private String password;
    
        @Bean(destroyMethod = "close")
        public RestHighLevelClient restClient() {
    
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
    
            RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, protocol)).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
    
            RestHighLevelClient client = new RestHighLevelClient(builder);
        
            return client;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2021-11-23
      • 2021-08-27
      相关资源
      最近更新 更多