问题描述:
在activemq的监听器中,通过注解@Autowired或@Resource注入bean时,获取到的bean为null。调用该bean的方法时会报空指针异常。
问题原因:
当调用bean内方法时,spring容器中还没有完成对注解bean的扫描,dispatcher.xml中配置的注解bean的优先级没有框架中的contextListener的优先级高,所以contextListener初始化的时候根据@Autowired扫描,肯定是null的。
解决办法:
在web.xml文件中增加一个监听器类,该类实现ServletContextListener,ApplicationContextAware这两个接口。
<listener>
<listener-class>com.activemq.common.InitComponent</listener-class>
</listener>
当容器启动的时候,会执行该类中的contextInitialized(ServletContextEvent servletContextEvent)方法。
我们要做的,就是在该类中新增获取bean的方法。
此时,获取bean的方式就变为:
ConsumerDao consumerDao = InitComponent.getBean("ConsumerDao");
consumerDao.saveMessage(param);
注意:
ConsumerDao接口上需要加上注解:@Repository("ConsumerDao")