2015-04-01 18 views
0

我想用@Resource註解在Java文件中注入一個數據源,它給了我一個NullPointerException。讓我感到困惑的是,當我把這個@Resource放在一個Servlet中時,它工作正常,我從數據庫中獲取數據。作爲重構工作的一部分,我只是試圖將這個@Resource註解從我的Servlet控制器調用到一個服務類,它給了我NPE。如何使用@Resource註釋在Java文件中注入數據源?在Servlet中正常工作雖然

ProductPageController.java

@WebServlet(name = "ProductPageController", urlPatterns = {"/" + AppConstants.PRODUCT_PAGE_CONTROLLER}) 
public class ProductPageController extends HttpServlet { 

    private static final Logger LOG = Logger.getLogger(ProductPageController.class); 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     LOG.debug("Into the ProductPageController..."); 

     //fetch the product from the db based on productId parameter 
     String productId = GenericUtils.getParameter(request, "productId"); 
     request.setAttribute("product", new ProductService().getProduct(new Integer(productId))); 

     //show the page now 
     showPage(request, response, PRODUCT_PAGE_URL); 
    } 

    private void showPage(HttpServletRequest request, HttpServletResponse response, String viewName) throws ServletException, IOException { 
     LOG.debug("Displaying " + viewName + " page now..."); 
     request.getServletContext().getRequestDispatcher(viewName).forward(request, response); 
    } 
} 

ProductService.java

public class ProductService { 

    private static final Logger LOG = Logger.getLogger(ProductService.class); 

    @Resource(name = "jdbc/istore-db") 
    private DataSource dataSource; 

    public Product getProduct(int productId) { 
     Product product = null; 
     try { 
      product = new MasterDao(dataSource).getProduct(productId); 
     } catch (SQLException sqle) { 
      LOG.error("Exception while fetching product based on productId: " + productId); 
      LOG.error(sqle); 
     } 
     LOG.debug("product = " + product); 
     return product; 
    } 
} 

錯誤日誌:

java.lang.NullPointerException 
    at com.istore.dao.MasterDao.getProduct(MasterDao.java:75) 
    at com.istore.service.ProductService.getProduct(ProductService.java:38) 
    at com.istore.web.controllers.ProductPageController.processRequest(ProductPageController.java:35) 
    at com.istore.web.controllers.ProductPageController.doGet(ProductPageController.java:22) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+2

強調'新的ProductService()'。這不是由容器管理的。 – 2015-04-01 19:42:41

+0

@Sotirios - 請您澄清一下,因爲我不瞭解您的觀點? – user2325154 2015-04-01 19:47:34

+0

您期待字段'dataSource'不爲空。爲什麼? – 2015-04-01 19:47:59

回答

0

如果您正在使用new ProductService()實例化自己的類,然後不依賴注入會發生。

您將不得不在您的servlet中注入ProductService。

@Inject 
private ProductService productService 
+0

我是否也在某個xml文件的其他任何位置定義了這個'productService' bean? – user2325154 2015-04-01 19:54:53

+0

你使用什麼應用服務器? – 2015-04-01 19:55:41

+0

Tomcat 8容器 – user2325154 2015-04-01 19:57:16

相關問題