当我通过HttpSession将InputStream对象发送到另一个servlet时,为什么InputStream对象返回NullPointerException?

问题描述

我试图通过将InputStream对象从一个servlet发送到另一个servlet,方法是将其设置为HttpSession Interface对象的属性。 但是,当我尝试在另一个servlet中检索它时,它将返回NullPointerException。

Servlet1.java

main.js?d610:7356 UnkNown option 'eventDrop'
warnUnkNownoptions @ main.js?d610:7356
CalendarDataManager._computeOptionsData @ main.js?d610:7143
eval @ main.js?d610:983
CalendarDataManager @ main.js?d610:6974
Calendar @ main.js?573d:53
eval @ index.js?b635:45

Servlet2.java

HttpSession session = request.getSession(false);

protected void doPost(HttpServletRequest request,HttpServletResponse response)
        throws servletexception,IOException {

    try (PrintWriter out = response.getWriter()) {
        Part part = request.getPart("file");
        InputStream is = part.getInputStream();
        
        LinkedHashMap<String,String> listofColumns = TypeCheck.typeCheck(is);
        boolean test = listofColumns.isEmpty();
        if (!test) {
            
        
            HttpSession session=request.getSession();
            
            session.setAttribute("myObjectId",is);
            
            request.setAttribute("listofColumns",listofColumns);
            request.getRequestdispatcher("showcolumns.jsp").forward(request,response);
            
            System.out.println("Columns name shown in JSP page");
        } else {
            System.out.println("Something went wrong");
        }

    } catch (Exception ex) {
        System.out.println("Exception Occured: " + ex);
    }
    doGet(request,response);
}

当我尝试使用InputStream对象时,它给出了NullPointerException。 请赐教。

解决方法

因为InputStream本身实际上不包含任何数据。它只是指向原始HttpServletRequest正文中包含的数据的指针。一旦第一个servlet完成其任务,则基本上将整个请求(包括其主体)丢弃。 InputStream现在将不再指向任何内容。当您尝试在第二个servlet中读取它时,在完全不同的HttpServletRequest中,它可能会抛出NPE,因为它找不到包含需要读取的数据的原始HttpServletRequest。>

解决方案很简单:只需立即将其读入byte[]或更好的temporary File中,然后将其传递出去即可。