使用 Spring Data 将 Spring Boot 应用程序与 Elasticsearch 8.6 连接的问题

问题描述 投票:0回答:3

我是 ElasticSearch 的新手,我想要一个连接到数据库 ElasticSearch 8.6 的 Spring Boot 应用程序,以便对索引进行 CRUD 操作。 我试图使用 Spring Boot 和 ElasticSearch 数据库来创建 CRUD 应用程序。

实体:

@Document(createIndex = true, indexName = "client")
public class ClientEntity {

  public ClientEntity() {
    super();
  }

  @Id
  private String id;

  @Field(type = FieldType.Text, name = "name")
  private String name;

  @Field(type = FieldType.Long, name = "phoneNumber")
  private Long phone;

Spring Data 的存储库接口是:

    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    import org.springframework.stereotype.Repository;

    @Repository
    public interface ClientRepository extends ElasticsearchRepository<ClientEntity, String> {
    
    }

弹性搜索配置:

    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.client.RestClient;
    import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.elasticsearch.client.ClientConfiguration;
    import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;
    import     org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
    
    import co.elastic.clients.elasticsearch.ElasticsearchClient;
    import co.elastic.clients.json.jackson.JacksonJsonpMapper;
    import co.elastic.clients.transport.ElasticsearchTransport;
    import co.elastic.clients.transport.rest_client.RestClientTransport;
    
    @Configuration
    public class ConfigElasticSearch extends ElasticsearchConfiguration {
      @Bean
      public ElasticsearchTransport getElasticsearchTransport() {
        return new RestClientTransport(getRestClient(), new JacksonJsonpMapper());
      }

      @Bean
      public ElasticsearchClient getElasticsearchClient() {
        ElasticsearchClient client = new ElasticsearchClient(getElasticsearchTransport());
        return client;
      }

      @Override
      public ClientConfiguration clientConfiguration() {
        return ClientConfiguration.builder().connectedTo("localhost:9200")
         .withBasicAuth("user", "my-password").build();
      }

pom.xml:

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.7.12</version>
    </parent>

    <properties>
      <java.version>17</java.version>
      <spring-cloud.version>2021.0.5</spring-cloud.version>
      <json-web-token.version>0.9.1</json-web-token.version>   
      <org-modelmapper.version>3.1.1</org-modelmapper.version>
    </properties>
    <dependencies>
          <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>${org-modelmapper.version}</version>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
    
    <!-- ES -->
           <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
          </dependency>
         <dependency>
            <groupId>jakarta.json</groupId>
            <artifactId>jakarta.json-api</artifactId>
         </dependency>
        <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
        </dependency>    

使用 Spring Data 存储库的服务如下:


    @Service("clientPersistence")
    public class ClientPersistenceElasticSearchDb {

      @Autowired
      private ClientRepository clientRepository;

      public Stream\<ClientEntity\> findAll() {
       return StreamSupport.stream(this.clientRepository.findAll().spliterator(), false);
      }

      public Optional\<ClientEntity\> findById(String id) {
        return clientRepository.findById(id);
      }
    }

我的微服务的主要配置是:


    @SpringBootApplication
    public class ClientMicroserviceApplication {

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

    }

如果我启动微服务,我会在启动时收到以下信息(然后微服务挂起):

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“clientPersistencia”的bean时出错:通过字段“clientRepository”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建在 es.clientmicroservice.dao.clientRepository 中定义的名为“clientRepository”的 bean 时出错,该 bean 在 ConfigElasticSearch 上声明的 @EnableElasticsearchRepositories 中定义:设置 bean 属性时无法解析对 bean“elasticsearchTemplate”的引用'弹性搜索操作';嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建在类路径资源 [es/clientmicroservice/config/ConfigElasticSearch .class] 中定义的名为“elasticsearchOperations”的 bean 时出错:通过方法“elasticsearchOperations”参数 1 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建在类路径资源 [es/clientmicroservice/config/ConfigElasticSearch .class] 中定义的名为“elasticsearchClient”的 bean 时出错:通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [co.elastic.clients.elasticsearch.ElasticsearchClient]:工厂方法“elasticsearchClient”抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: jakarta/json/spi/JsonProvider

我不知道为什么我的类 clientPersistence 没有构建,因为缺少 JsonProvider 依赖项。

有人可以帮助我吗?

提前谢谢您!!

java spring maven spring-data-elasticsearch
3个回答
0
投票

查看 Spring Boot 版本,您使用的是 Spring Data Elasticsearch 4.4.x(现已停止维护)。您正在使用新 Elasticsearch 客户端 (

org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration
) 的配置。当时的新客户端的使用是在 4.4 中引入的,作为一个仍然是新的且可能不稳定的功能。

我没有看到您设置了

jakarta-json.version
(请参阅文档了解新客户端的配置。

您是否有特殊原因覆盖并提供

getElasticsearchTransport()
getElasticsearchClient()
?这些 bean 已经由基类提供,您唯一需要提供的方法就是提供配置的方法。

请记住,使用该版本并连接到 Elasticsearch 8 时,您需要在每个请求上设置兼容性标头,请参阅文档了解这一点。

我建议您使用最新版本的 Spring Data Elasticsearch。


0
投票

您正在使用 spring-boot-starter-parent:2.7.12,这意味着您正在使用 spring-boot-starter-data-elasticsearch:2.7.12。如果您查看依赖项,最后一个依赖于 spring-data-elasticsearch:4.4.124.4.x 的迁移指南表示您需要手动添加一些依赖项。我在问题中显示的

pom.xml
中没有看到任何依赖关系。


0
投票

我有同样的错误,我使用的版本是: Spring Data Elasticsearch:5.3.2 弹性搜索:8.13.4 Spring框架:6.1.11 根据版本兼容性矩阵:https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.html 兼容,但似乎我缺少一些东西, 这是我的 pom.xml:

4.0.0 org.springframework.boot spring-boot-starter-父级 3.3.2 com.example 弹性搜索测试 0.0.1-快照 弹性搜索测试 弹性搜索测试 17 org.springframework.boot spring-boot-starter-data-elasticsearch org.springframework.boot spring-boot-启动器-web

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

    <dependency>
        <groupId>co.elastic.clients</groupId>
        <artifactId>elasticsearch-java</artifactId>
        <version>8.13.4</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

我使用的弹性搜索图像是:docker.elastic.co/elasticsearch/elasticsearch:8.13.4

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.