【问题标题】:How to properly @Autowire a component in a Spring Boot App如何在 Spring Boot 应用程序中正确 @Autowire 组件
【发布时间】:2018-01-03 19:50:56
【问题描述】:

我正在组装一个简单的 Spring Boot 应用程序,但遇到了 @Autowired 字段未“显示”的问题。

我的主要应用类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringElasticCatalogApi {

    public static void main(String[] args) {
        SpringApplication.run(SpringElasticCatalogApi.class, args);
    }
}

我的存储库类:

import com.discover.harmony.elastic.model.Customer;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public interface CustomerRepository extends ElasticsearchRepository<Customer, String> {

    public Customer findByFirstName(String firstName);

    public List<Customer> findByLastName(String lastName);

}

这个类(“Loaders”)需要一个@Autowired存储库字段,它是NULL:

import com.discover.harmony.elastic.model.BusinessMetadata;
import com.discover.harmony.elastic.model.Customer;
//import com.discover.harmony.elastic.repository.CustomerRepository;
import com.discover.harmony.elastic.api.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

//@Configuration

@Component
public class Loaders {

    @Autowired
    private CustomerRepository repository;

    @PostConstruct
    @Transactional
    public void loadAll(){
        this.repository.deleteAll();
        saveCustomers();
        fetchAllCustomers();
        fetchIndividualCustomers();

    }

    private void saveCustomers() {
        this.repository.save(new Customer("Alice", "Smith"));
        this.repository.save(new Customer("Bob", "Smith"));
    }

    private void fetchAllCustomers() {
        System.out.println("Customers found with findAll():");
        System.out.println("-------------------------------");
        for (Customer customer : this.repository.findAll()) {
            System.out.println(customer);
        }
        System.out.println();
    }

    private void fetchIndividualCustomers() {
        System.out.println("Customer found with findByFirstName('Alice'):");
        System.out.println("--------------------------------");
        System.out.println(this.repository.findByFirstName("Alice"));

        System.out.println("Customers found with findByLastName('Smith'):");
        System.out.println("--------------------------------");
        for (Customer customer : this.repository.findByLastName("Smith")) {
            System.out.println(customer);
        }
    }

    private List<BusinessMetadata> getData() {
        List<BusinessMetadata> metadata = new ArrayList<>();
        metadata.add(new BusinessMetadata((long)1,"TradeLine"));
        metadata.add(new BusinessMetadata((long)2,"Credit Line"));
        metadata.add(new BusinessMetadata((long)3,"Other Line"));

        return metadata;
    }
}

我应该改变什么,以使@Autowire 在这里按预期工作?

【问题讨论】:

  • 这些对象在哪些包中?
  • 你在哪里使用 Loaders 类?你能发布那个代码吗?
  • 当然。这是我的仓库:github.com/eugene-goldberg/SpringbootCatalogApi
  • 使用@EnableElasticsearchRepositories 启用弹性存储库的自动配置(例如在SpringElasticCatalogApi 类上)。然后定义一个elasticsearchTemplate Bean(类型为ElasticsearchOperations。然后您可以省略CustomerRepository 类上的@Component 注释,因为它是按约定拾取的。

标签: java spring spring-boot


【解决方案1】:

问题是您的示例在实现 ElasticSearch 方面并不完整。为了证明这一点,将您的 CustomerRepository 变成一个类并删除 ElasticsearchRepository&lt;Customer, String&gt; 然后一切正常。

您需要做的是添加一个新的Configuration 类,使用@EnableElasticsearchRepositories(basePackages = "com.discover.harmony.elastic.api.CustomerRepository") 来扫描提供的包以查找Spring Data 存储库。

你可以找到一个完整的例子here

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2020-03-30
    • 2021-05-30
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多