Исключение нулевого указателя при автопроводке LinkedBlockingQueue - PullRequest
2 голосов
/ 29 января 2012

Я получаю исключение нулевого указателя при попытке добавить что-либо в мой solrQueue. Я проверил в отладчике, и это потому, что solrQueue является нулевым. Но я автоматически подключил его в контексте приложения, тогда почему эта ошибка?

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 ]

7 голосов
/ 29 января 2012

Вы создаете экземпляр класса Check вручную, а не просите Spring создать / вернуть его для вас:

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

Это никогда не будет * работать, так как Spring не знает о том, что вы создали Check класс. В зависимости от того, как вы запускаете свой контекст Spring, вы должны либо явно задать контекст приложения:

Check check = applicationContext.getBean(Check.class)

или введите компонент check в другой компонент, например контроллер:

@Autowired
private Check check;

Смотри также:

* Плетение из AspectJ поможет, но это похоже на использование пушки для убийства мухи

0 голосов
/ 29 января 2012

Не думаю, что вы можете смешивать аннотации и XML-конфигурацию.Здесь есть 2 решения:

  1. Удалите объявление bean-компонента Check в своем XML-файле и добавьте аннотацию @Component в свой класс Check.

  2. Внедрите свойство solrQueue в ваш компонент в XML:

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

0 голосов
/ 29 января 2012

Причина кроется здесь:

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

Включая annotation-config, вы разрешаете Spring использовать такие расширения, как @Autowired аннотация.Это, однако, не означает, что Spring будет знать, как это сделать самостоятельно.

Чтобы @Autowired работал, вам нужно определить соответствующий компонент в контексте вашего приложения.Вы можете сделать это либо вручную (поместив <bean> объявлений в XML), либо автоматически (используя component-scan).

Решение

попытаться раскомментировать <context:component-scan /> и установите правильное значение base-package, соответствующее пакету компонентов, который вы хотите подключить автоматически.

Примечание

, если компоненты, которые вы хотите подключить, принадлежат третьей сторонебиблиотека, обычно более удобно использовать явное определение <bean class="com.somecompany.SomeComponent" /> в XML.

...