Spring Boot 2.0.0.M2 和 Spring Data Elasticsearch 配置

标签 spring maven spring-boot spring-data-elasticsearch

我正在尝试将我的项目移动到 Spring Boot 2.0.0.M2

这是我旧的 Spring Data Elasticsearch 配置:

import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

@Profile("production")
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.domain.repository.elasticsearch")
public class ElasticsearchConfig {

    @Value("${elasticsearch.host}")
    private String host;

    @Value("${elasticsearch.port}")
    private int port;

    @Bean
    public Client client() throws Exception {
        return TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws Exception {
        return new ElasticsearchTemplate(client());
    }

}

现在我遇到了以下问题:

1. The method builder() is undefined for the type TransportClient
2. InetSocketTransportAddress cannot be resolved to a type

在 Maven 类路径上,我有 Spring Data Elasticsearch 3.0.0.M4:

enter image description here

如何正确配置当前版本的 Spring Data Elasticsearch?

已更新

对于我的测试,我使用带有以下 application.properties 的嵌入式 Elasticsearch:

#Elasticsearch
spring.data.elasticsearch.properties.http.enabled=true
spring.data.elasticsearch.properties.http.port=9250
spring.data.elasticsearch.properties.path.home=target/test-elasticsearch-db
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=60s

这是我的 ES 测试配置:

@Profile("test")
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.domain.repository.elasticsearch")
public class ElasticsearchTestConfig {
}

现在测试失败并出现以下错误:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'elasticsearchTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfiguration.class]: Unsatisfied dependency expressed through method 'elasticsearchTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.elasticsearch.client.Client' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:726) ~[spring-beans-5.0.0.RC2.jar:5.0.0.RC2]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:458) ~[spring-beans-5.0.0.RC2.jar:5.0.0.RC2]

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.elasticsearch.client.Client' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1478) ~[spring-beans-5.0.0.RC2.jar:5.0.0.RC2]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1089) ~[spring-beans-5.0.0.RC2.jar:5.0.0.RC2]

这里有什么问题以及如何解决这个问题?

最佳答案

Spring Boot 2.0 使用 Elasticsearch 5,其中包含一些重大的 API 更改。如果您使用 Spring Boot 的自动配置而不是尝试编写自己的配置,那么您将不会受到这些更改的影响。

所需要的只是 spring.data.elasticsearch.cluster-nodes 属性的值。有了它,Spring Boot 将自动配置 TransportClientElasticsearchTemplate

关于Spring Boot 2.0.0.M2 和 Spring Data Elasticsearch 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45263021/

相关文章:

java - gradle从 war 依赖项中导入了什么,我如何控制/操纵 war 内容?

java - Spring/Hibernate (JUnit4) 中的集成测试问题

spring-boot - 缺少 Content-Length header 使用 WebClient 发送 POST 请求(SpringBoot 2.0.2.RELEASE)

spring - 在 arangodb-spring-data 中启用 javax.validation.constraints

java - Spring消息包问题

java - 从 BOOT-INF/classes 读取文件

java - Spring Boot项目中的Eclipse "cannot resolve type"

java - Spring 启动 (2.0.4.RELEASE) - IllegalArgumentException : Not a managed type

java - Spring Boot websocket握手间歇性挂起

java - spring boot - 在同一线程上创建和销毁bean