Question

I am running a custom tag in a Spring JSP. I am getting the following error message.

java.lang.NullPointerException
    com.dao.Poll1DAO.getVotes(Poll1DAO.java:27)
    com.tags.Poll1Tag.doTag(Poll1Tag.java:23)
    org.apache.jsp.WEB_002dINF.pages.PollPage_jsp._jspx_meth_myTag1_005fpoll1_005f0(PollPage_jsp.java:602)
    org.apache.jsp.WEB_002dINF.pages.PollPage_jsp._jspService(PollPage_jsp.java:195)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1265)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1016)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:965)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:859)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:883)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:781)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Here is Poll1DAO.getVotes().

public HashMap<String, Object> getVotes() {
    // following line is line 27, referenced in error message
    return (HashMap<String, Object>) this.getJdbcTemplate().queryForMap(
            "select yes, no from poll1 where id = 1");
}

Here is Poll1Tag.doTag().

Poll1DAO poll1DAO = new Poll1DAO();

public void doTag() throws JspException, IOException {
    PageContext pageContext = (PageContext) getJspContext();
    boolean foundCookie = cookieFound();

        pageContext.setAttribute("foundCookiePoll1", foundCookie);
        if (foundCookie) {
            // following line is line 23, referenced in error message
            HashMap<String, Object> poll1Votes = poll1DAO.getVotes();
            pageContext.setAttribute("poll1Yes", (int) poll1Votes.get("yes"));
            pageContext.setAttribute("poll1No", (int) poll1Votes.get("no"));
        }
}
Was it helpful?

Solution

If you are using IoC container such as Spring's application context you should never create managed bean instances by yourself. You always need to pull the instance out from the container - i.e. ApplicationContext. Otherwise they will not be initalized with the necessary dependencies.

Now the question you should ask is - how can I get ApplicationContext instance in a JSP tag class. The answer is simple - just look how the standard Spring tags are doing that (I mean that - go check that link).

// Example on how to obtain bean from JSP tag (ignoring context hierarchy)
WebApplicationContextUtils.getRequiredWebApplicationContext(pageContext.getServletContext()).
        getBeansOfType(Poll1DAO.class).values().iterator().next();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top