如何自动装配泛型类型[重复]

Posted

技术标签:

【中文标题】如何自动装配泛型类型[重复]【英文标题】:How to autowire generic type [duplicate] 【发布时间】:2016-05-26 09:25:50 【问题描述】:

我想在 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");
    


【问题讨论】:

看起来您创建了一个 SolrCrudRepository 以自动装配到您的应用程序上下文中。 【参考方案1】:

您正在使用new 创建FcSolrServiceImplFcSolrServiceImpl&lt;Product&gt; fpsi = new FcSolrServiceImpl&lt;Product&gt;();

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

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

【讨论】:

【参考方案2】:

问题是当你像FcSolrServiceImpl&lt;Product&gt; fpsi = new FcSolrServiceImpl&lt;Product&gt;();这样初始化服务实例时,它不在Spring上下文中。结果,SolrCrudRepository&lt;K, String&gt; repository 被初始化为空值。

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

要正确初始化它,请使用以下 sn-p:

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);

【讨论】:

以上是关于如何自动装配泛型类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用构造函数自动装配泛型类型 [Spring 4.2.5]

基于java容器注解---基于泛型的自动装配

Spring框架bean的配置:基于注解的配置,Autowired 自动装配 Bean,泛型依赖注入

.net 自动装配解决加载重复装配

SpringBoot自动装配流程源码分析

Spring自动装配空指针异常[重复]