代码之家  ›  专栏  ›  技术社区  ›  Eugene Goldberg

如何在Spring Boot应用程序中正确@自动连接组件

  •  0
  • Eugene Goldberg  · 技术社区  · 7 年前

    我正在组装一个简单的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 repository字段,该字段为空:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Luay Abdulraheem    7 年前

    问题是,您的示例在实现ElasticSearch方面并不完整。为了证明这一点 CustomerRepository 进入类并删除 ElasticsearchRepository<Customer, String> 然后一切都会好起来的。

    您需要做的是添加新的 Configuration 类,带 @EnableElasticsearchRepositories(basePackages = "com.discover.harmony.elastic.api.CustomerRepository") 为Spring数据存储库扫描提供的包。

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