NutzCN Logo
问答 起了多线程,发现获取HttpServletRequest和HttpServletResponse报空指针异常
发布于 2656天前 作者 qq_710cab78 9225 次浏览 复制 上一个帖子 下一个帖子
标签: jsp 多线程

HttpServletResponse response = Mvcs.getResp();
HttpServletRequest request = Mvcs.getReq();

异常:
java.lang.NullPointerException
at businessUtils.ParseJspUtils.getHtml(ParseJspUtils.java:46)
at todoMail(Order.java:1674)
at mail.thread.TodoMailRunnable.run(TodoMailRunnable.java:64)

在多线程环境,如何获取HttpServletRequest和HttpServletResponse 不为空?

6 回复

'因为不在请求的作用域里面了

另外,不应该在其他线程中操作req和resp,因为原线程可能已经执行完,req和resp也变成无效对象了.

我在ParseJspUtils.getHtml组装html,再把html组装成邮件发出,所以只要能生成转化的html就可以,不需要返回。
public class ParseJspUtils {

/**
 * 获取jsp产生的html
 * @param path
 * @param data
 * @return
 * @throws Throwable
 */
public static Map<String,Object> getHtml(String path,Map<String,Object> data){
    Map<String,Object> result = new HashMap<String,Object>();
    try {

//多线程这里会报空指针异常   
     HttpServletResponse response = Mvcs.getResp();
HttpServletRequest request = Mvcs.getReq();

        RequestDispatcher rd = request.getRequestDispatcher(path);

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os,
               "UTF-8"));
       HttpServletResponse rep = new HttpServletResponseWrapper(response) {
            public PrintWriter getWriter() throws IOException {
                return pw;
            }
        };

        request.setAttribute("obj", data);
        rd.include(request, rep);
        pw.flush();
        result.put(MainModule.JTABLE_RESULT_KEY, MainModule.JTABLE_RESULT_VALUE_OK);
        result.put("html", os.toString("UTF-8"));
    } catch (Exception e) {
       result.put(MainModule.JTABLE_RESULT_KEY, MainModule.JTABLE_RESULT_VALUE_ERROR);
       // TODO Auto-generated catch block
       e.printStackTrace();
    }

    return result;
}

}

那你也得找个真的req和resp,作为参数传进去,然后开线程执行

@wendal  我把代码修改了,把HttpServletRequest request,HttpServletResponse response传进去,发现
request.setAttribute("obj", data); 报下面的空指针异常,但打断点,发现传进来的request和response都不为空。
是不是由于多线程原因,导致HttpServletRequest在主线程结束后销毁了,导致新启动的线程request.setAttribute为空呢?
java.lang.NullPointerException
at org.apache.catalina.connector.Request.setAttribute(Request.java:1509)
at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:503)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:284)

是的,所以还是同步执行好了...

添加回复
请先登陆
回到顶部