我想在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");
}
}
答案 0 :(得分:1)
您正在使用FcSolrServiceImpl
创建new
。 FcSolrServiceImpl<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);