如何自动装配通用类型

时间:2016-02-15 12:52:17

标签: java spring

我想在FcSolrServiceImpl类中使用@autowire SolrCrudRepository但它在NPE中给出。以下是我的实施。

FcSolrServiceImpl.java

public class FcSolrServiceImpl<K> {

    @Autowired(required = true)
    SolrCrudRepository<K, String> repository;

    public void saveProduct(K input) {
        repository.save(input);  // Getting null pointer in repository
    }
}

Product.java

@SolrDocument(solrCoreName = "core1")
public class Product {

    Product() {
    };

    @Field
    @Id
    private String id;

    // getter setter hashcode equals toString methods

}

FcIndexSyncApplication.java

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class FcIndexSyncApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(FcIndexSyncApplication.class, args);
        FcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();

        Product input = new Product();
        input.setID("abc");

        fpsi.saveProduct(input);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(FcIndexSyncApplication.class);
    }

    @Bean
    public SolrTemplate solrTemplate() throws Exception {
        HttpSolrServer httpSolrServer = new HttpSolrServer("${spring.data.solr.host}");
        return new SolrTemplate(httpSolrServer, "core1");
    }

}

2 个答案:

答案 0 :(得分:1)

您正在使用FcSolrServiceImpl创建newFcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();

那样春天对这个对象一无所知。你必须从Spring上下文中获取bean,才能使用依赖注入:

ApplicationContext ctx = SpringApplication.run(FcIndexSyncApplication.class, args);
FcSolrServiceImpl myBean = ctx.getBean(FcSolrServiceImpl.class);
myBean....

答案 1 :(得分:1)

问题是当你初始化像FcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();这样的服务实例时,它不在Spring上下文中。因此,SolrCrudRepository<K, String> repository初始化为空值。

由于您使用的是组件扫描,请使用FcSolrServiceImpl注释标记@Service

要正确初始化,请使用以下代码段:

final ApplicationContext context= SpringApplication.run(FcIndexSyncApplication.class, args);
final FcSolrServiceImpl<Product> fpsi= context.getBean(PersonServiceImpl.class);
Product input = new Product();
input.setID("abc");
fpsi.saveProduct(input);