I am getting null pointer exception while trying to add anything in my solrQueue. I checked in debugger and it is because solrQueue is null. But I have autowired it in my application context then why this error?
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
}
}
application 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>
You are creating an instance of
Check
class manually rather than asking Spring to create/return one for you:This will never* work since Spring has no knowledge about you created
Check
class. Depending on how do you start you Spring context, you must either explicitly ask the application context:or inject the
check
bean into some other compoent like controller:See also:
* AspectJ weaving will do the trick, but this is like using a cannon to kill a fly
The reason lies here:
By including
annotation-config
you are allowing Spring to be using such extensions as@Autowired
annotation. This, however, doesn't mean that Spring will know how to do that by itself.For
@Autowired
to work, you need to have a matching bean defined in your application context. You can do that either manually (by placing<bean>
declarations in XML) or automatically (by usingcomponent-scan
).Solution
try to uncomment
<context:component-scan />
and set properbase-package
, matching the package of components you want to wire up automatically.Note
if the components you want to wire are in third party library, it's usually more convenient to use an explicit
<bean class="com.somecompany.SomeComponent" />
definition within XML.I don't think that you can mix annotation and XML based config. 2 solutions here :
Remove the declaration of the Check bean in your XML file and add a
@Component
annotation on your Check class.Inject the
solrQueue
property to your bean in the XML :<bean id="check" class="com.abc.Check" scope="prototype"> <property name="solrQueue" ref="solrQueue"/> </bean>