【问题标题】: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 以自动装配到您的应用程序上下文中。

标签: java spring


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 2015-12-03
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多