2012-02-06 17 views
0

誰かが私に次の問題を助けてくれるかどうかは分かります。 私はPrintingBeanとそのすべてを記入するジャスパー報告書を持っています。request.getSession()is null

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

それは新しいセッションを作る(私は、GUI上でそれを見ることができないようですが、そのすべて、そうです:私は私のアプリがでnullポインタ例外をスローします(アプレットを開く)印刷プレビュー]ボタンをクリックした瞬間良い)。私の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'にアクセスした 'if'ブロックで' NullPointerException'が実際に*スローされますか?それははるかに理にかなって、答えられる*ことができます。 – BalusC

+0

request.getSession()には属性(サイズは0)がなく、.getAttribute( "printMB")がまったく存在しないので、ifブロックでNPEをスローします。なぜ、どのようにこの問題を処理するか考えていますか?あなたの時間に感謝します – falconiki

答えて

1

セッションは、名前がJSESSIONIDのクッキーによって維持されます。通常、このクッキーはセッション開始時にサーバーによって設定され、このクッキーはセッション中の後続の単一のHTTP要求ごとにクライアントからサーバーに返されます。クライアント(Webブラウザ)はこれをすべて透過的に行います。 How do servlets work? Instantiation, sessions, shared variables and multithreadingも参照してください。

アプレットでは、ウェブブラウザーと同じようにシミュレートする必要があります。アプレットがサーブレットに接続し、アプレットを提供しているページと同じセッションにアクセスする必要がある場合は、アプレットが送信したHTTPリクエストに非常に同じセッションクッキーを追加する必要があります。

最も簡単なアプレットへのパラメータとしてセッションIDを渡すことです:

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

(注:JSPを使用していた場合、私は、あなたがビューテクノロジーとしてFaceletsを使用していることを仮定しています、あなたはそれに応じてアプレットに必要なセッションクッキーを設定できるように、あなたは)代わりに

${pageContext.session.id}を使用する必要があります。

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

request.getSession()のサーブレットに同じセッションを戻す必要があります。

+0

これをアプレットに追加し、私のセッションには最後に属性がありました。しかし、私はジャスパー4.0.2バージョンでレポートを実行するので別のエラーが発生しましたので、プロジェクトのpomファイルを変更してしまいました。 – falconiki

0

セッションがあるよりも要求がある場合。私は.getAttribute("printMB")がnullだと思います。 PrintingBeanにキャストする前に確認する必要があります。

+0

'Null 'を他のタイプにキャスティングしてもNPEは投げられません。 – BalusC