GWT + Ireport

Boa tarde pessoal, tudo bom?
Pessoal, estou desenvolvendo uma aplicação utilizando GWT porem qdo efetuo a chamada para impressão de um recibo em pdf acontece o seguindo erro:

13:22:02,062 ERROR JRViewer:2035 - Page paint error. java.lang.ClassCastException: net.sf.jasperreports.engine.export.DefaultExporterFilterFactory cannot be cast to net.sf.jasperreports.engine.export.ExporterFilterFactory at net.sf.jasperreports.engine.export.ExporterFilterFactoryUtil.getFilterFactory(ExporterFilterFactoryUtil.java:53) at net.sf.jasperreports.engine.JRAbstractExporter.createFilter(JRAbstractExporter.java:1296) at net.sf.jasperreports.engine.export.JRGraphics2DExporter.exportReport(JRGraphics2DExporter.java:118) at net.sf.jasperreports.view.JRViewer.paintPage(JRViewer.java:2029) at net.sf.jasperreports.view.JRViewer$PageRenderer.paintComponent(JRViewer.java:2179) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JViewport.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JLayeredPane.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) at javax.swing.BufferStrategyPaintManager.paint(Unknown Source) at javax.swing.RepaintManager.paint(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) at java.awt.Container.paint(Unknown Source) at java.awt.Window.paint(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Mesmo dando esse erro ele abre o PDF e mostra a seguinte mensagem:
Erro ao expor página do relatório. Verifique o console para detalhes.

Meu codigo [code] servico.imprimirRecibo(5, new AsyncCallback() {

		public void onSuccess(Integer result) {
			Info.display("Imprimindo Recibo. ", "Recibo {0} ",
					 "");
			retorno = true;
			
		}
		
		public void onFailure(Throwable caught) {
			com.google.gwt.user.client.Window.alert("Falhou....." + caught);
			caught.printStackTrace();
			
		}
	});[/code]

Alguem sabe o que pode estar acontecendo?
Precisam de mais informações?
Vlwww

Blz Denis,

por acaso está usando NetBeans?

Já passei por este problema aparentemente sem solução. Fui desaconselhado aqui no GUJ a não desenvolver relatórios usando IReport com NetBeans. Se possível, crie seus relatórios por fora e chame pelo Eclipse ou outra IDE de sua preferência. Pelo Eclipse, todos os projetos que migrei funcionaram sem problemas.

A princípio, com Netbeans o que me disseram é que “pode” ser algo relacionado a gerenciamento de memória das libs do Jasper, mas nada ao certo ainda.

Conclusão: migre para outra IDE quando seu sistema exigir relatórios com Jasper.

Att,

Denis,

fiz mais uns testes aqui com outra chamada do viewer, com o Netbeans e não deu nenhum erro. Segue o código que funcionou (comentada a linha que dá erro).

Vale a tentativa !!

.
..
...
    String relatorio = "C:\\Users\\...\\Documents\\NetBeansProjects\\JasperReports\\web\\relatorio\\" + request.getParameter("relatorio") + ".jasper";
    
    Connection con = null;
    
    try
    {
      Class.forName("com.mysql.jdbc.Driver");
      con = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco", "user", "password");
      
      HashMap<String, String> parameterMap = new HashMap<String, String>();
      parameterMap.put("pSTATUS_USUARIO", "A");
      
      JasperPrint jp = JasperFillManager.fillReport(relatorio, parameterMap, con);
      //JasperViewer.viewReport(jp, false);
      JasperViewer.viewReport(jp);
      con.close();
      
      RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
      rd.forward(request, response);
    }
    catch (SQLException e)
    {
      e.printStackTrace();
    }
...
..
.

Inté.

Olá,

deixe-me ver se entendi o que você está fazendo. Primeiro você está gerando um relatório que deve ser apresentado no lado cliente pelo browser ? Se sim, então por que você está utilizando o método viewReport do Jasper ? Tecnicamente esse método abre o relatório com um view com componentes swing, e não é assim que você irá transmitir o pdf para o cliente. Nesse link você encontrará um exemplo que te dará uma orientação de como enviar um relatório para o cliente. Mas note que esse exemplo é um exemplo mais ou menos de como você irá criar o servlet que enviará o relatório para o cliente.

Blz Vagner,

segui sua dica e meu código está conforme abaixo, porém está ocorrendo uma NullPointerException na linha em vermelho ou seja, getSystemResource está retornando null.

        response.setContentType("application/pdf"); 
        response.setHeader("Content-disposition", "attachment; filename=\"" + getNomeArquivo() + ".pdf\""); 
		
		try
		{
			//JasperPrint jp = JasperFillManager.fillReport(getCaminhoCompleto() , parametros, con);
			
			URL url = ClassLoader.getSystemResource( "/PrjRelatorio/WebContent/relatorio/rptUsuario.jasper" ); 
			
			[color=red]File file = new File( url.toURI() ); [/color]       // Erro ocorre aqui     
            InputStream inputStream = new FileInputStream(file); 
            JasperPrint jp = JasperFillManager.fillReport(inputStream, parametros , con);
            
            byte[] report = JasperExportManager.exportReportToPdf(jp);
            
            response.setContentLength(report.length); 
            ServletOutputStream out = response.getOutputStream(); 
            out.write(report); 
            out.flush(); 
            out.close(); 
			
			if ( jp.getPages().size() > 0 )   
			{
				setEof(false);
				JasperViewer.viewReport(jp, false);
			}
			else
			{
				setEof(true);
			}
			retorno = true;
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

O que pode estar errado?

Obrigado.

Olá,

substitua essa linha:

URL url = ClassLoader.getSystemResource( “/PrjRelatorio/WebContent/relatorio/rptUsuario.jasper” );

por essa:

File file = new File(getServletContext().getRealPath("/WebContent/relatorio/rptUsuario.jasper"));

Estou assumindo que o diretório WebContent está na raiz da aplicação web, caso não esteja, então você pode ajustar.