无法在配置中找到Bean方法'elasticsearchTemplate'

问题描述

得到以下错误


申请无法开始


说明:

com.rahul.es.api.service.QueryDSLService中的字段模板需要找不到类型为'org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate'的bean。

注入点具有以下注释: -@ org.springframework.beans.factory.annotation.Autowired(required = true)

找到了以下候选者,但无法注入: -由于@ConditionalOnMissingBean(名称:elasticsearchTemplate类型:org.springframework.data.elasticsearch.core.ElasticsearchOperations; SearchStrategy:all)发现类型为“ org.springframework.data”的bean,因此未加载“ ElasticsearchDataConfiguration.RestClientConfiguration”中的Bean方法“ elasticsearchTemplate”。 elasticsearch.core.ElasticsearchOperations的elasticsearchTemplate,发现了名为elasticsearchTemplate的bean

动作:

考虑在您的配置中重新访问以上条目或定义类型为“ org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate”的bean。

EsConfig.java

---
- debug:
    msg: "{{ tower_webhook_payload.commits | map(attribute='modified')
      | list | flatten
      | map('regex_replace','repository/([^/]*)/.*','\\1')
      | list | unique }}"

QueryDSLService

@Configuration(proxyBeanMethods=false)
@EnableElasticsearchRepositories(basePackages = "com.rahul.es.api.repository")
@ComponentScan(basePackages = { "com.rahul.es.api.service" })
public class EsConfig {

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration clientConfiguration 
            = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();
 
        return RestClients.create(clientConfiguration).rest();
    }
 
    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }
}

RestController

@Service
public class QueryDSLService {

    @Autowired
    private ElasticsearchRestTemplate template;

    public List<Customer> searchMultipleField(String firstname,int age) {

        QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("firstname",firstname))
                .must(QueryBuilders.matchQuery("age",age));

        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(query).build();
        List<Customer> customers = template.queryForList(nativeSearchQuery,Customer.class);
        return customers;
    }

    public List<Customer> getCustomerSearchData(String input) {
        String search = ".*" + input + ".*";
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withFilter(QueryBuilders.regexpQuery("firstname",search)).build();
        List<Customer> customers = template.queryForList(searchQuery,Customer.class);
        return customers;
    }

    public List<Customer> multiMatchQuery(String text) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(text)
                .field("firstname").field("lastname").type(MultiMatchQueryBuilder.Type.BEST_FIELDS)).build();
        List<Customer> customers = template.queryForList(searchQuery,Customer.class);
        return customers;

    }

}

解决方法

尝试添加Bean名称,如文档所述https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients

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

代替注入 ElasticsearchOperations 的bean,您需要注入 ElasticsearchRestTemplate ,因为错误明确指出并将beanName从 elasticsearchTemplate 更改为 elasticsearchRestTemplate

    @Bean
    public ElasticsearchRestTemplate elasticsearchRestTemplate()
    {
        return new ElasticsearchRestTemplate(client());
    }

注意:由于我刚刚遇到过同样的问题,因此我已经对其进行了测试。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...