自动装配LinkedBlockingQueue时出现空指针异常

时间:2012-01-29 14:37:14

标签: spring nullpointerexception autowired

尝试在solrQueue中添加任何内容时,我得到空指针异常。我检查了调试器,这是因为solrQueue为null。但是我已经在我的应用程序上下文中自动启动了它为什么会出现此错误?

public class Check {
    @Autowired
    public LinkedBlockingQueue<SolrInputDocument> solrQueue;
    public SolrInputDocument solrDoc;   
    public void solradd(){
        solrDoc=new SolrInputDocument();
        solrDoc.addField("title", "abc");
        solrQueue.add(solrDoc);//solrQueue is null 
    }
}

应用程序Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config />
    <!--<context:component-scan base-package="com/abc" />   -->

    <bean id="solrQueue" class="java.util.concurrent.LinkedBlockingQueue" />
    <bean id="check" class="com.abc.Check" scope="prototype" />

</beans>

3 个答案:

答案 0 :(得分:7)

您正在手动创建Check类的实例,而不是要求Spring为您创建/返回一个实例:

Check c=new Check();
c.solradd();

由于Spring不知道你创建了Check类,所以永远都不会工作。根据您如何启动Spring上下文,您必须明确询问应用程序上下文:

Check check = applicationContext.getBean(Check.class)

或将check bean注入其他组件如控制器:

@Autowired
private Check check;

另见:

* AspectJ编织将起作用,但这就像使用大炮杀死苍蝇

答案 1 :(得分:0)

原因在于:

<context:annotation-config />
<!--<context:component-scan base-package="com/abc" />   -->

通过包含annotation-config,您允许Spring使用@Autowired注释这样的扩展名。然而,这并不意味着Spring本身就知道如何做到这一点。

要使@Autowired起作用,您需要在应用程序上下文中定义匹配的bean。您可以手动(通过在XML中放置<bean>声明)或自动(使用component-scan)来执行此操作。

<强>解决方案

尝试取消注释<context:component-scan />并设置正确的base-package,与您要自动连接的组件包匹配。

注意

如果要连接的组件在第三方库中,则在XML中使用显式<bean class="com.somecompany.SomeComponent" />定义通常更方便。

答案 2 :(得分:0)

我认为您不能混合注释和基于XML的配置。 这里有2个解决方案:

  1. 删除XML文件中的Check bean声明,并在Check类上添加@Component注释。

  2. 在XML中将solrQueue属性注入您的bean:

    <bean id="check" class="com.abc.Check" scope="prototype"> <property name="solrQueue" ref="solrQueue"/> </bean>