JSP上的removeAttribute()发生意外的NullPointerException重新部署

时间:2016-05-04 12:52:31

标签: java jsp nullpointerexception tomcat7 scriptlet

急于发布,我不得不将使用自定义标签制作的JSP的一部分与另一部分集成,这显示了一些与scriptlest的信息。

为了使两者协同工作,我将一个对象从标记处理程序doStartTag()暴露给请求范围,在scriptlet中检索该对象,然后在标记处理程序执行流程的末尾将其删除, doEndTag()

有些代码应该澄清我的情况。

这是标签处理程序的相关部分:

public int doStartTag() throws JspException {
    // ...

    // obj is a private member
    pageContext.setAttribute("productFromTag", obj, PageContext.REQUEST_SCOPE);

    return EVAL_BODY_INCLUDE;
}

// ...

public int doEndTag() throws JspException {
    pageContext.removeAttribute("productFromTag", PageContext.REQUEST_SCOPE);
    return EVAL_PAGE;
}

这是JSP中检索和处理对象的部分:

<pre:product><!-- this adds the Product instance to the request scope -->
<div class="item">

    <!-- other HTML -->

         <p class="productName"><prod:name></prod:name></p>
         <%
            Product p = (Product) request.getAttribute("productFromTag");
            // Use p

         %>

         <!-- other HTML -->
   </div>
</pre:product>

第一次部署后一切正常,但如果我替换JSP(比如编辑后),removeAttribute()方法会抛出NullPointerException

Caused by: java.lang.NullPointerException
    at org.apache.jasper.runtime.PageContextImpl.doRemoveAttribute(PageContextImpl.java:398)
    at org.apache.jasper.runtime.PageContextImpl.removeAttribute(PageContextImpl.java:387)
    at xx.xxxxx.xxxx.ProductTag.release(ProductTag.java:89)
    at org.apache.jasper.runtime.TagHandlerPool.release(TagHandlerPool.java:165)
    at org.apache.jsp.modelli.camediResponsive.catalogo.schedaProdotto_jsp._jspDestroy(schedaProdotto_jsp.java:200)
    at org.apache.jasper.runtime.HttpJspBase.destroy(HttpJspBase.java:60)
    at org.apache.jasper.servlet.JspServletWrapper.destroy(JspServletWrapper.java:478)
    at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:166)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    ... 83 more

通过阅读removeAttribute() javadoc,不应抛出任何异常 我误读了文档吗?难道我做错了什么? 我经常在Eclipse内部编辑或运行生产应用程序时替换(即重新部署)JSP,但我已经面临这种情况。

当然,我已经在方法调用周围添加了catch(),但我很困惑为什么会这样。

0 个答案:

没有答案