1

I want to @autowire SolrCrudRepository in FcSolrServiceImpl class but it gives in NPE. following is my implementation.

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

}
2787184
  • 3,749
  • 10
  • 47
  • 81

2 Answers2

1

You're creating the FcSolrServiceImpl with new. FcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();

That way Spring don't know anything about that object. You have to get the bean from the Spring context, to use the dependency injection:

ApplicationContext ctx = SpringApplication.run(FcIndexSyncApplication.class, args);
FcSolrServiceImpl myBean = ctx.getBean(FcSolrServiceImpl.class);
myBean....
Evgeni Dimitrov
  • 21,976
  • 33
  • 120
  • 145
1

The problem is that when you initialize the instance of service like this FcSolrServiceImpl<Product> fpsi = new FcSolrServiceImpl<Product>();, it is not in Spring context. As a result it SolrCrudRepository<K, String> repository is initialized with null value.

Since you are using component scan, mark you FcSolrServiceImpl with @Service annotation.

To initialize it correctly use the following snippet:

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);
Kuvaldis
  • 348
  • 1
  • 9