如何自动装配泛型类型[重复]
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
创建FcSolrServiceImpl
。 FcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();
这样,Spring 对该对象一无所知。您必须从 Spring 上下文中获取 bean,才能使用依赖注入:
ApplicationContext ctx = SpringApplication.run(FcIndexSyncApplication.class, args);
FcSolrServiceImpl myBean = ctx.getBean(FcSolrServiceImpl.class);
myBean....
【讨论】:
【参考方案2】:问题是当你像FcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();
这样初始化服务实例时,它不在Spring上下文中。结果,SolrCrudRepository<K, String> 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);
【讨论】:
以上是关于如何自动装配泛型类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章