2012-02-06 60 views
0

如果有人幫我解決以下問題,我將不勝感激。 我有一個碧玉的報告,我填寫PrintingBean,它的一切都很好。我在打印預覽按鈕按下的那一刻(打開小程序)我的應用程序在拋出一個空指針異常:request.getSession()爲空

if (bean.getPrintingDataList() != null && !bean.getPrintingDataList().isEmpty()) 

看起來這使得新的會話(但我不能看到,圖形用戶界面,其所有好)。我的manageBean是一個SessionScoped。這是我的整個方法:

private void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    JasperPrint jasperPrint = null; 

    try { 
     PrintingBean bean = (PrintingBean) request.getSession().getAttribute("printMB"); 
     if (bean.getPrintingDataList() != null && !bean.getPrintingDataList().isEmpty()) { 
      jasperPrint = printManager.print(bean.getPrintingDataList()); 
     } 
    } catch (Exception ex) { 
     Logger.getLogger(JasperPrintServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    if (jasperPrint != null) { 
     response.setContentType("application/octet-stream"); 
     ServletOutputStream ouputStream = response.getOutputStream(); 

     ObjectOutputStream oos = new ObjectOutputStream(ouputStream); 
     oos.writeObject(jasperPrint); 
     oos.flush(); 
     oos.close(); 

     ouputStream.flush(); 
     ouputStream.close(); 
    } 
} 
+1

這是不可能的。 *你是否真的*表示它在給定的行上返回'null',並且在你訪問'bean'的地方''NullPointerException''實際上*拋出了'if'塊?這會更有意義,並且*可以*被回答。 – BalusC 2012-02-06 14:05:02

+0

是的,你是對的,它會在if塊中引發NPE,因爲request.getSession()沒有屬性(大小爲0),並且.getAttribute(「printMB」)根本不存在。你有什麼想法爲什麼以及如何處理這個問題?感謝您的時間 – falconiki 2012-02-07 13:36:58

回答

1

會話由名爲JSESSIONID的cookie進行維護。通常,這個cookie在會話開始時由服務器設置,並且該cookie在整個會話中隨後的每個HTTP請求中從客戶端返回到服務器。客戶端(網頁瀏覽器)完全透明。另見How do servlets work? Instantiation, sessions, shared variables and multithreading

在小程序中,您需要模擬Web瀏覽器正在執行的操作。當小應用程序連接到servlet並需要訪問與提供小應用程序的頁面相同的會話時,則應確保將相同的會話cookie附加到由小應用程序發送的HTTP請求。

最簡單的是通過會話ID作爲參數傳遞給小程序:

<param name="JSESSIONID" value="#{session.id}"> 

(注:我假設你正在使用的Facelets作爲視圖技術,如果您正在使用JSP,那麼你應該使用${pageContext.session.id}代替)

這樣就可以在小程序相應地設置所需要的會話cookie:

String jSessionID = getParameter("JSESSIONID"); 
URL servletURL = new URL(getCodeBase(), "yourServletURL"); 
URLConnection connection = servletURL.openConnection(); 
connection.setRequestProperty("Cookie", "JSESSIONID=" + jSessionID); 
// ... 

這應該會給您在request.getSession()上的servlet中返回相同的會話。

+0

我把這個添加到applet和我的會話最後有屬性..但我有另一個錯誤,所以我運行我的報告在碧玉4.0.2版本,因此我改變我的項目中的POM文件,它工作正常:)謝謝 – falconiki 2012-02-16 11:04:54

0

如果有一個請求比必須有一個會話。我認爲.getAttribute("printMB")爲空。您必須先檢查並將其轉換爲PrintingBean

+0

向其他類型投射'null'不會拋出NPE。 – BalusC 2012-02-07 13:03:14

相關問題