解决servlet调用spring中bean的问题

一、问题说明

目前在做一个后台管理系统,涉及到了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 
	}



最后不要忘了在web.xml文件中配置一下相应的servlet
  <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>







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值