如何正确@Autowire Spring Boot App中的组件

时间:2018-01-03 19:50:56

标签: java spring spring-boot

我正在组建一个简单的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);

}

这个类(&#34; Loaders&#34;)需要一个@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在这里按预期工作?

1 个答案:

答案 0 :(得分:0)

问题是您的示例在实现ElasticSearch时尚未完成。要证明这一点,请将您的ElasticsearchRepository<Customer, String>转换为课程并移除Configuration然后一切正常。

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

您可以找到完整的示例Can I answer my own question?