当前位置: 首页 > 知识库问答 >
问题:

使用弹性搜索和SpringBoot创建bean时出错

笪成周
2023-03-14

我想把我的项目连接到弹性搜索。我得到以下错误:

com.example.demo.elasticsearch.controller中的字段存储库。控制器需要“com.example.demo.elasticsearch.repository”类型的bean。找不到CustomerRepository“。

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

行动:

Consider defining a bean of type 'com.example.demo.elasticsearch.repository.CustomerRepository' in your configuration.

2020-07-29 15:43:44.525  WARN 14432 --- [           main] o.s.boot.SpringApplication               : Unable to close ApplicationContext

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springApplicationAdminRegistrar' defined in class path resource [org/springframework/boot/autoconfigure/admin/SpringApplicationAdminJmxAutoConfiguration.class]: Unsatisfied dependency expressed through method 'springApplicationAdminRegistrar' parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.core.env.Environment' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]

所以我构建了一些类,如下所示:

Controller.java

package com.example.demo.elasticsearch.controller;

import com.example.demo.elasticsearch.model.Customer;
import com.example.demo.elasticsearch.repository.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

@org.springframework.stereotype.Controller
public class Controller {

    @Autowired
    private CustomerRepository repository;

    @PostMapping("/saveCustomer")
    public int saveCustomer(@RequestBody List<Customer> customers) {
        repository.saveAll(customers);
        return customers.size();
    }

    @GetMapping("/findAll")
    public Iterable<Customer> findAllCustomers() {
        return repository.findAll();
    }

    @GetMapping("/findByFName/{firstName}")
    public List<Customer> findByFirstName(@PathVariable String firstName) {
        return repository.findByFirstname(firstName);
    }
}

客户.java

package com.example.demo.elasticsearch.model;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "javatechie", type = "customer", shards = 2)
@Data
@AllArgsConstructor
@NoArgsConstructor

public class Customer {

    @Id
    private String id;
    private String firstname;
    private String lastname;
    private int age;

}

CustomerRepository.java

package com.example.demo.elasticsearch.repository;


import com.example.demo.elasticsearch.model.Customer;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository

public interface CustomerRepository extends ElasticsearchRepository<Customer, String> {

    List<Customer> findByFirstname(String firstName);

}

Build.gradle

// https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch
    compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '1.0.0.RELEASE'

 dependencies {
        classpath "org.elasticsearch.gradle:build-tools:6.5.4"
    }

共有1个答案

汪鸿志
2023-03-14

您是否有任何用于创建bean的配置类,如下所示

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.demo.elasticsearch.repository")
public class Config {
 
    @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());
    }
}

如果没有,请这样尝试。同时检查您正在使用的sping-data-elasticsearch版本(我认为1.0.0.RELEASE太旧了)

 类似资料:
  • 我是弹性搜索的新手,我正在尝试使用下面的映射创建索引,我在网上找到了这些映射,并使用kibana作为我的客户机,它抛出错误。 “类型”:“映射程序解析异常”,“原因”:“根映射定义有不受支持的参数:[local_test:{u all={enabled=false},properties={amount={type=long},user_id={type=keyword},recurtive={t

  • 我在使用Python弹性搜索访问数据时遇到了一个问题。我正在得到 尝试使用时出错 我的弹性搜索版本6.5。4,python版本3.7。2.

  • 我正在学习弹性搜索,还有很多东西我没有得到,但有一件事我不知道(或发现所有的)是什么时候使用一个索引,什么时候使用更多的索引。部分原因是我不知道弹性搜索索引到底是什么。 您能解释一下什么是弹性搜索索引吗?什么时候应该只对所有数据使用一个索引?什么时候应该将数据拆分为多个索引? 奖励点/或者,我如何判断何时需要将我的数据拆分为多个索引,然后,我应该如何决定如何将数据拆分为新的索引?

  • 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器:ElasticSearch-在名称中使用连字符进行搜索。 所以我做了这个映射: 所以char筛选器似乎没有在搜索字符串上执行?我该怎么做才能让它起作用?

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 我目前正在做一个小项目,计划展示数据库中的一些文档。我遇到了这个问题,springboot将我的控制器称为bean。这是我真正的豆子。 和我的控制器: 我的存储库 错误: 组织。springframework。豆。工厂UnsatisfiedPendencyException:创建名为“productController”的bean时出错,该bean在文件[E:\IntelijProj\target