Caros, aqui na empresa nos deparamos com o problema abaixo, já o corrigimos mas como não encontramos uma referência a isto aqui no GUJ resolvi compartilhar a solução que utilizamos.
Tinhamos uma estrutura de projetos parecida com a mostrada abaixo:
Para gerar o utilizamos o seguinte código:
/**
* Gera o relatório de logs.
*
* @param lines Logs processados que irão compor o relatório.
* @param reportType Tipo de relatorio a ser gerado, para saber quais tipos sao
* suportados consulte a enumeracao: {@link ReportType}.
*
* @return array de bytes representando o relatorio no formato indicado
*
* @throws JRException
* @throws Exception
*/
protected byte[] generateReport(List<Logs> lines, final ReportType reportType) throws JRException, Exception {
//Transforma a lista de beans em uma colecao de beans inteligivel para o Jasper
JRBeanCollectionDataSource jrBCDS = new JRBeanCollectionDataSource (LogsReportBean.getList(lines));
//Inclui os parametros
Map parameters = new HashMap();
//Preenche o relatorio com os dados. Gera o arquivo *.jrprint
URL url = this.getClass().getResource("ColllectReport.jasper");
JasperPrint jasperPrint = JasperFillManager.fillReport(url.getFile(), parameters, jrBCDS);
//Exporta para o formato PDF
switch(reportType){
case PDF: return JasperExportManager.exportReportToPdf(jasperPrint);
default: throw new IllegalArgumentException(MessagesManager.getInstance().getMessage("messagemanager.report.error.format.not.supported"));
}
}
Enquanto o projeto foi distribuido em uma estrutura de pastas que não utilizava espaços nos nomes (como C:/workspace/GujReports) nenhum erro foi detectado, porém quando distribuímos o projeto em uma estrutura com espaços no nome (como C:/projetos de exemplos/pasta com espaços no nome/GujReports) a geração do relatório acusava erro na linha:
JasperPrint jasperPrint = JasperFillManager.fillReport(url.getFile(), parameters, jrBCDS);
Não descobrimos ainda o porquê, mas sabemos que o uso dos caracteres %20 para substituir os espaços em branco no método fillReport causa o lançamento do erro:
Abriu sessao: br.com.guj.hibernate.core.HibernateSession$Owner@11d4ab7
/D:/Arquivos%20de%20Programa/Pasta%20com%20espaço/GujReports/build/web/WEB-INF/classes/br/com/guj/GujReports/model/business/reports/meters/MetersReport.jasper
27/09/2010 13:18:21 br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator generateReport
GRAVE: null
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:243)
at br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator.generateReport(MeterReportPdfGenerator.java:41)
at br.com.guj.GujReports.model.business.reports.meters.MetersReportGenerator.doReport(MetersReportGenerator.java:30)
at br.com.guj.GujReports.control.reports.meters.MetersReportAction.execute(MetersReportAction.java:56)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at br.com.guj.GujReports.control.filter.hibernate.session.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
... 27 more
27/09/2010 13:18:21 br.com.guj.GujReports.control.reports.meters.MetersReportAction execute
GRAVE: null
Fechou sessao: br.com.guj.hibernate.core.HibernateSession$Owner@11d4ab7
java.lang.RuntimeException: net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
at br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator.generateReport(MeterReportPdfGenerator.java:46)
at br.com.guj.GujReports.model.business.reports.meters.MetersReportGenerator.doReport(MetersReportGenerator.java:30)
at br.com.guj.GujReports.control.reports.meters.MetersReportAction.execute(MetersReportAction.java:56)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at br.com.guj.GujReports.control.filter.hibernate.session.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:243)
at br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator.generateReport(MeterReportPdfGenerator.java:41)
... 24 more
Caused by: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
... 27 more
Para corrigir substituimos a linha citada acima por esta:
Espero ter ajudado.
Ps. Caso exista uma solução mais elegante ou alguém souber o porquê do erro quando usamos url.getFile() por favor comente.