问题描述
得到以下错误:
申请无法开始
说明:
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());
}
注意:由于我刚刚遇到过同样的问题,因此我已经对其进行了测试。