我在Spring中定义了一个服务
@Service("StockageService")
public class StockageServiceImpl implements StockageService{
}
与
public interface StockageService extends Serializable {
}
我需要在servlet中调用此服务
所以我写了
public class SpringApplicationContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
sce.getServletContext().setAttribute("applicationContext", ac);
}
public void contextDestroyed(ServletContextEvent sce) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
并且
public class handler extends HttpServlet {
private String message;
private StockageService stockageService;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ApplicationContext ac = (ApplicationContext) config.getServletContext().getAttribute("applicationContext");
this.stockageService = (StockageService)ac.getBean("StockageService");
}
问题是我在最后提到的行
获得了NPE (StockageService)ac.getBean("StockageService");
我在哪里犯了错误?
答案 0 :(得分:2)
首先,感谢ankur-singhal花时间回答我的问题
我理解你答案的理由,但是当我调用
时它不起作用ApplicationContextUtils. getApplicationContext().getBean("StockageService");
所以我使用的技巧有效,但我不太了解
我覆盖了servlet中的init,如下所示
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
config.getServletContext());
}
我必须放一个
@Autowired
private StockageService stockageService;
在servlet中并且它可以正常工作
答案 1 :(得分:1)
似乎ApplicationContext
本身就是null
。
请查看以下代码并尝试使用此功能。
ApplicationContextUtils.java
我们将创建以下实用程序类,它实现ApplicationContextAware
并提供将由spring容器调用的setApplicationContext
,并且applicationContext
将由它传递。我们将它存储在静态变量中,并通过get方法公开它,以便可以通过应用程序访问它。
您可以在创建ApplicationContext
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
ctx = appContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
}