一、问题说明
目前在做一个后台管理系统,涉及到了web server。在码代码的过程中,突然发现一个问题,即在servlet中调用在spring中已经初始化的bean时,总是返回NullPointer Exception的异常,即空指针异常。
二、解决方法
原文地址:
http://blog.csdn.net/kalso4212h2o/article/details/7275342 顺便感谢一些博主,帮了我个大忙;
1.原理分析
其实我们使用spring的目的就是为了让spring为我们来提供一个已经被注入好的一个实例。而servlet是不同的,servlet是有生命周期的,而这个并不归属spring管理,而是由web容器管理的。那么当servlet刚刚创建的时候,spring可以为servlet注入,当你访问的时候,由于servlet是单实例多线程的,所以,servlet信息被重置,刚刚被注入的对象又为null了。
2.解决方法
其实只要我在获得servlet的时候,用从Spring获得,而不是由web容器获得就可以了。而解决这个方法的思路就是,我们使用一个代理的servlet,利用这个代理的servlet去调用我们的业务servlet(其中这个业务servlet是被配置为spring中的bean),这样就可以实现其他bean注入,然后使用代理servlet调用。
3.代码实现
service层的实现
使用注解的方式来定义bean,当然也可使用xml文件来定义
@Service("merBankeService")
public class MerchantBankServiceImpl implements MerchantBankServiceI {
private static final Logger logger = Logger
.getLogger(MerchantBankServiceImpl.class);
private BaseDaoI<Tmerchantbank> merchantBankDao;
private BaseDaoI<Trecord> recordDao;
public BaseDaoI<Trecord> getRecordDao() {
return recordDao;
}
@Autowired
public void setRecordDao(BaseDaoI<Trecord> recordDao) {
this.recordDao = recordDao;
}
public BaseDaoI<Tmerchantbank> getMerchantBankDao() {
return merchantBankDao;
}
@Autowired
public void setMerchantBankDao(BaseDaoI<Tmerchantbank> merchantBankDao) {
this.merchantBankDao = merchantBankDao;
}
servlet的实现
业务逻辑的代码就不写了,只写如何解决在servlet中调用spring中的bean的代码了。
public void init() throws ServletException {
super.init();
ServletContext servletContext = this.getServletContext();
WebApplicationContext wac = null;
wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
this.setMerBankService((MerchantBankServiceI) wac.getBean("merBankeService"));//在service层中使用@service注解的bean
}
<servlet>
<servlet-name>OnlineTransactionServlet</servlet-name>
<servlet-class>crb.servlet.account.OnlineTransactionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OnlineTransactionServlet</servlet-name>
<url-pattern>/account/OnlineTransactionServlet</url-pattern>
</servlet-mapping>