IndexRequest 已弃用

问题描述

我正在使用 RestHighLevelClient,在 main 方法中我使用了 IndexRequest(由于已弃用,此方法关闭)。我使用 7.10.1 弹性搜索。当我运行程序时,出现以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig
    at org.elasticsearch.client.RestClientBuilder.createHttpClient(RestClientBuilder.java:211)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.elasticsearch.client.RestClientBuilder.build(RestClientBuilder.java:201)
    at org.elasticsearch.client.RestHighLevelClient.<init>(RestHighLevelClient.java:291)
    at org.elasticsearch.client.RestHighLevelClient.<init>(RestHighLevelClient.java:283)
    at com.gihub.simplesteph.kafka.tutorial3.ElasticSearchConsumer.createClient(ElasticSearchConsumer.java:41)
    at com.gihub.simplesteph.kafka.tutorial3.ElasticSearchConsumer.main(ElasticSearchConsumer.java:46)
Caused by: java.lang.classNotFoundException: org.apache.http.client.config.RequestConfig
    at java.net.urlclassloader.findClass(urlclassloader.java:382)
    at java.lang.classLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.classLoader.loadClass(ClassLoader.java:351)
    ... 7 more

我需要您的支持解决我的问题,下面是ElasticSearchConsumer.javapom.xml代码。我尝试了很多食谱,但我遇到了同样的错误

package com.gihub.simplesteph.kafka.tutorial3;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncclientBuilder;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;

public class ElasticSearchConsumer {

    public  static RestHighLevelClient createClient(){

        // replace with your own credentials
        String hostname = "xxxxxxxxxxxxxxxxxxxxxxxx";
        String username = "xxxxxxxxxx";
        String password = "xxxxxxx";

        //don't do if you run a local ES
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(username,password));

        RestClientBuilder builder = RestClient.builder(
                new HttpHost(hostname,443,"https"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncclientBuilder customizeHttpClient(HttpAsyncclientBuilder httpAsyncclientBuilder) {
                        return httpAsyncclientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }
    public static void main(String[] args) throws IOException {
        Logger logger = LoggerFactory.getLogger(ElasticSearchConsumer.class.getName());
        RestHighLevelClient client = createClient();

        String jsonString = "{ \"foo\": \"bar\" }";

        IndexRequest indexRequest = new IndexRequest("twitter","tweets" ).source(jsonString,XContentType.JSON);

        IndexResponse indexResponse = client.index(indexRequest,RequestOptions.DEFAULT);
        String id = indexResponse.getIndex();
        logger.info(id);

        //close the client gracefully
        client.close();

    }
}

pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>kafka-beginners-course</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>kafka-consumer-elasticsearch</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.10.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <!--            <scope>test</scope>-->
        </dependency>


        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>

    </dependencies>

</project>

谢谢!

解决方法

NoClassDefFoundError 通常表示依赖在编译时存在,但在运行时不存在。

您需要确保在运行项目时它具有所有 the necessary dependencies on the classpath

,

如果您的设置中有多个模块,则在主模块中添加 org.apache.httpcomponents 依赖项,这对我有用。

并且在创建 IndexRequest 时,不要在构造函数中添加主题, 像这样使用它:

IndexRequest indexRequest = new IndexRequest(
    "ur_index"
).source(urJsonString,XContentType.JSON);