2012-02-06 8 views
0

누군가가 다음 문제를 해결해 주시면 감사하겠습니다. 저는 재 스퍼 보고서를 가지고 있습니다.이 보고서는 PrintingBean과 그 모두를 채 웁니다. 내 응용 프로그램에서 널 포인터 예외가 발생합니다 (애플릿을 열어) 나 인쇄 미리보기 버튼을 클릭하는 순간 : 그것은 새로운 세션 (하지만 GUI에 그것을 볼 수 있습니다처럼request.getSession() is null

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'에 접근 한'if' 블록에서'NullPointerException'이 실제로'if' 블록에 던져지는 것을 실제로 의미하지 않습니까? 그러면 훨씬 더 의미가 생겨 응답 될 수 있습니다. – BalusC

+0

그렇습니다. request.getSession()에 속성 (크기가 0)이없고 .getAttribute ("printMB")가 전혀 존재하지 않으므로 네가 맞으면 NPE를 if 블록에 던집니다. 왜 그리고 어떻게이 문제를 해결할 수 있는지 알고 있습니까? 시간 내 주셔서 감사합니다. – falconiki

답변

1

세션은 이름이 JSESSIONID 인 쿠키로 유지 관리됩니다. 일반적으로이 쿠키는 세션이 시작될 때 서버에 의해 설정되며이 쿠키는 세션 전체의 후속 단일 HTTP 요청마다 클라이언트에서 서버로 반환됩니다. 클라이언트 (웹 브라우저)는이 모든 것을 투명하게 처리합니다. 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