Hello! <br /><br />I'm having some problems viewing reports that have parameters: the report viewer throws a null pointer exception, and since it's not my code that's doing it, I can't even view the stack trace. Everything was fine when I had the code to generate the viewer and the report source inside of a servlet, but when I moved it to a POJO, this thing started. I can view every report, regardless of whether or not it has data saved in it, except the ones that have parameter fields.<br /><br />Could anyone help me out w/ this and let me know what the problem is and what I can do to fix it? I don't understand why it would work when everything was done within a servelt and this happens as soon as I move it to a pojo.<br /><br />Thanks so much!<br /><br />Here's the code for the pojo:<br /><br />
<br />/*<br /> * ReportViewerFactory.java<br /> *<br /> * Created on March 30, 2007, 10:06 AM<br /> */<br /><br />package com.ruffalocody.reports;<br /><br />import com.crystaldecisions.sdk.occa.report.lib.ReportSDKExceptionBase;<br />// CR View:<br />import com.crystaldecisions.report.web.viewer.*;<br />import com.crystaldecisions.sdk.occa.report.reportsource.IReportSource;<br />// CR Export:<br />import com.crystaldecisions.report.web.viewer.ReportExportControl;<br />import com.crystaldecisions.sdk.occa.report.exportoptions.ExportOptions;<br />import com.crystaldecisions.sdk.occa.report.exportoptions.IPDFExportFormatOptions;<br />import com.crystaldecisions.sdk.occa.report.exportoptions.PDFExportFormatOptions;<br />import com.crystaldecisions.sdk.occa.report.exportoptions.ReportExportFormat;<br />import com.crystaldecisions.sdk.occa.report.exportoptions.RTFWordExportFormatOptions;<br /><br />import java.sql.*;<br /><br />/**<br /> * Creates a report viewer, weather for viewing or exporting purposes.<br /> *<br /> * @author aerohner<br /> */<br />public class ReportViewerFactory<br />{<br /> private ReportServerControl rptViewer;<br /> /** Creates a new instance of ReportViewerFactory */<br /> public ReportViewerFactory(ReportRequest rptReq)<br /> throws ReportSDKExceptionBase<br /> {<br /> IReportSource rptSrc = rptReq.getReportSource();<br /><br /> if (rptReq.getRequestedAction() == ReportRequest.VIEW)<br /> rptViewer = createViewer(rptReq);<br /><br /> else if(rptReq.getRequestedAction() == ReportRequest.EXPORT)<br /> rptViewer = createExporter(rptReq);<br /><br /> }// end constructor ReportViewerFactory()<br /> private ReportServerControl createViewer(ReportRequest rptReq) <br /> throws ReportSDKExceptionBase<br /> {<br /> ReportServerControl viewer = new CrystalReportViewer();<br /><br /> viewer.setOwnPage(true);<br /> viewer.setOwnForm(true);<br /><br /> viewer.setReportSource(rptReq.getReportSource());<br /><br /> return viewer;<br /><br /> }// end createViewer(.)<br /> private ReportServerControl createExporter(ReportRequest rptReq) <br /> throws ReportSDKExceptionBase<br /> {<br /> // getting values out of rptReq<br /> int exportFormatInt = rptReq.getExportFormat();<br /> int start = rptReq.getPageStart();<br /> int end = rptReq.getPageEnd();<br /><br /> ReportExportControl rptExportControl = new ReportExportControl();<br /> ExportOptions exportOptions = new ExportOptions();<br /><br /> ReportExportFormat expFormat = <br /> ReportExportFormat.from_int(rptReq.getExportFormat());<br /><br /> // if user requested to export a specified range of pages.<br /> if(!rptReq.getExportAllPages())<br /> {<br /> // TODO check if range is valid<br /><br /> if(exportFormatInt == ReportExportFormat._RTF ||<br /> exportFormatInt == ReportExportFormat._MSWord)<br /> {<br /> RTFWordExportFormatOptions rtfFormatOpts = <br /> new RTFWordExportFormatOptions();<br /><br /> rtfFormatOpts.setStartPageNumber(start);<br /> rtfFormatOpts.setEndPageNumber(end);<br /><br /> exportOptions.setFormatOptions(rtfFormatOpts);<br /> }// end if rtf<br /> else if (exportFormatInt == ReportExportFormat._PDF)<br /> {<br /> IPDFExportFormatOptions pdfFormatOpts = <br /> new PDFExportFormatOptions();<br /> pdfFormatOpts.setStartPageNumber(start);<br /> pdfFormatOpts.setEndPageNumber(end);<br /><br /> exportOptions.setFormatOptions(pdfFormatOpts);<br /> }// end else if pdf<br /> }// end if range of pages<br /><br /> rptExportControl.setReportSource(rptReq.getReportSource());<br /><br /> exportOptions.setExportFormatType(expFormat);<br /><br /> rptExportControl.setExportOptions(exportOptions);<br /> rptExportControl.setExportAsAttachment(true); <br /><br /> return rptExportControl;<br /><br /> }// end createExporter(.)<br /> public ReportServerControl getReportViewer()<br /> {<br /> return rptViewer;<br /> }// end getReportViewer()<br /><br /> public void setReportViewer(ReportServerControl rptViewer)<br /> {<br /> this.rptViewer = rptViewer;<br /> }// end setReportViewer(.)<br /> }// end ReportViewerFactory<br />
<br /><br />Then the ReportServlet that initiates this class gets the viewer from this class and the report source, sets them as session attributes and does a request dispatcher forward to view jsp.<br /><br />view.jsp just does the following:<br /><br />
<br /><%<br /> ReportServerControl viewer = (ReportServerControl)<br /> request.getSession(false).getAttribute("viewer");<br /> IReportSource rptSrc = (IReportSource)request.getSession(true).getAttribute("reportSource");<br /> if (viewer != null)<br /> {<br /> viewer.processHttpRequest(request,response, <br /> getServletConfig().getServletContext(),null);<br /> if(!(viewer instanceof CrystalReportViewer))<br /> {<br /> // trying to avoid "report source expired"<br /> // error when viewing the next page of report<br /> viewer.dispose();<br /> }<br /> }// end if viewer null<br /> else<br /> {<br /> RequestDispatcher rd = request.getRequestDispatcher("errorPage");<br /> request.setAttribute("errorMsg", "view.jsp: viewer is null");<br /> rd.forward(request, response);<br /> }// end else viewer not null<br /> %><br />
<br /><br /><br />