bean方法“elasticsearchtemplate”

k5ifujac  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(1245)

获取以下错误:
应用程序启动失败
说明:
com.rahul.es.api.service.querydslservice中的字段模板需要找不到类型为“org.springframework.data.elasticsearch.core.elasticsearchrestemplate”的bean。
注入点具有以下注解:-@org.springframework.beans.factory.annotation.autowired(required=true)
已找到以下候选对象,但无法注入:“'elasticsearchdataconfiguration.restclientconfiguration'中的bean方法'elasticsearchtemplate'未加载,因为@conditionalonmissingbean(名称:elasticsearchtemplate types:org.springframework.data.elasticsearch.core.elasticsearchoperations;searchstrategy:all)找到了“org.springframework.data.elasticsearch.core.elasticsearchoperations”elasticsearchtemplate类型的bean,并找到了名为elasticsearchtemplate的bean
行动:
考虑重新访问上面的条目或在配置中定义类型为“org.springframework.data.elasticsearch.core.elasticsearchrestemplate”的bean。
esconfig.java文件

  1. @Configuration(proxyBeanMethods=false)
  2. @EnableElasticsearchRepositories(basePackages = "com.rahul.es.api.repository")
  3. @ComponentScan(basePackages = { "com.rahul.es.api.service" })
  4. public class EsConfig {
  5. @Bean
  6. public RestHighLevelClient client() {
  7. ClientConfiguration clientConfiguration
  8. = ClientConfiguration.builder()
  9. .connectedTo("localhost:9200")
  10. .build();
  11. return RestClients.create(clientConfiguration).rest();
  12. }
  13. @Bean
  14. public ElasticsearchOperations elasticsearchTemplate() {
  15. return new ElasticsearchRestTemplate(client());
  16. }
  17. }

查询服务

  1. @Service
  2. public class QueryDSLService {
  3. @Autowired
  4. private ElasticsearchRestTemplate template;
  5. public List<Customer> searchMultipleField(String firstname, int age) {
  6. QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("firstname", firstname))
  7. .must(QueryBuilders.matchQuery("age", age));
  8. NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(query).build();
  9. List<Customer> customers = template.queryForList(nativeSearchQuery, Customer.class);
  10. return customers;
  11. }
  12. public List<Customer> getCustomerSearchData(String input) {
  13. String search = ".*" + input + ".*";
  14. SearchQuery searchQuery = new NativeSearchQueryBuilder()
  15. .withFilter(QueryBuilders.regexpQuery("firstname", search)).build();
  16. List<Customer> customers = template.queryForList(searchQuery, Customer.class);
  17. return customers;
  18. }
  19. public List<Customer> multiMatchQuery(String text) {
  20. SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(text)
  21. .field("firstname").field("lastname").type(MultiMatchQueryBuilder.Type.BEST_FIELDS)).build();
  22. List<Customer> customers = template.queryForList(searchQuery, Customer.class);
  23. return customers;
  24. }
  25. }

REST控制器

  1. @SpringBootApplication
  2. @RestController
  3. public class SpringbootElasticsearchQuerydslApplication {
  4. @Autowired
  5. private QueryDSLService service;
  6. @GetMapping("/serachMultiField/{firstname}/{age}")
  7. public List<Customer> serachByMultiField(@PathVariable String firstname, @PathVariable int age) {
  8. return service.searchMultipleField(firstname, age);
  9. }
  10. @GetMapping("/customSearch/{firstName}")
  11. public List<Customer> getCustomerByField(@PathVariable String firstName) {
  12. return service.getCustomerSearchData(firstName);
  13. }
  14. /**Based on wildcard method */
  15. @GetMapping("/search/{text}")
  16. public List<Customer> doMultimatchQuery(@PathVariable String text) {
  17. return service.multiMatchQuery(text);
  18. }
  19. public static void main(String[] args) {
  20. SpringApplication.run(SpringbootElasticsearchQuerydslApplication.class, args);
  21. }
  22. }
5hcedyr0

5hcedyr01#

与注入elasticsearchoperations的bean不同,您需要注入elasticsearchrestemplate,因为错误清楚地表明了这一点,并将beanname从elasticsearchtemplate更改为elasticsearchrestemplate。

  1. @Bean
  2. public ElasticsearchRestTemplate elasticsearchRestTemplate()
  3. {
  4. return new ElasticsearchRestTemplate(client());
  5. }

注意:我已经在我这边测试过了,因为我刚刚遇到了同样的问题。

0s7z1bwu

0s7z1bwu2#

试着像文档中说的那样添加bean名称https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients

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

相关问题