为什么在我的servlet中调用服务给了我一个NPE(spring)

时间:2014-07-29 15:23:47

标签: spring servlets

我在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");  

我在哪里犯了错误?

2 个答案:

答案 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;
  }
}