Relatórios IReport não carregam no servidor

Boa tarde pessoal,

estou tendo dificuldades em deixar uma aplicação rodando diretamente no servidor, principalmente com os relatórios do iReport…

tenho desenvolvido uma aplicação utilizando eclipse helios, mysql 5.1, apache tomcat 7, iReport 3.7, JSF 2 e primefaces. Na estação que uso para desenvolver, está tudo funcionando corretamente.

Necessito configurar essa aplicação em um servidor que roda Cent OS 6. Já configurei tudo o que preciso para deixar a aplicação rodando, inclusive ela esta funcionando, porem, a unica funcionalidade dessa aplicação que não esta funcionando são os relatórios… :confused:

Quando clico para gerar qualquer relatório, a aplicação até chega a processar, mas não mostra relatorio algum, apenas uma pagina em branco.

Alguem tem alguma ideia do que pode estar ocorrendo?

Obrigado a todos!

Olá ahdeerre,

Isso é relativo, pode estar ocorrendo muita coisa, bom primeiro seria bom você verificar se o servidor web está retorna algum StackTrace, assim teremos um principio do que examinar. O mais comum em aplicações é o servidor estar buscando o path errado do seu relatório (arquivo.jasper) assim como também não respondendo corretamente o Response do jasper, ai entra o caso da sua resposta (content-type) se é um PDF, HTML e assim por diante.

[quote=gustavo_l_walker]Olá ahdeerre,

Isso é relativo, pode estar ocorrendo muita coisa, bom primeiro seria bom você verificar se o servidor web está retorna algum StackTrace, assim teremos um principio do que examinar. O mais comum em aplicações é o servidor estar buscando o path errado do seu relatório (arquivo.jasper) assim como também não respondendo corretamente o Response do jasper, ai entra o caso da sua resposta (content-type) se é um PDF, HTML e assim por diante.[/quote]

Olá gustavo, obrigado pela resposta…
onde posso consultar no servidor o que ele está retornando de erro, pois pelo eclipse ele tem uma aba console e no servidor não sei como verificar onde são mostrados os erros.
Quando clico para gerar um relatório ele abre uma nova aba no navegador com o relatorio em PDF (isso rodando pelo eclipse). Quando no servidor, ao clicar para gerar o relatório apenas abre uma aba do navegador em branco.

inclui uma linha para tentar verificar o erro quando não é gerado o relatório e me retornou a seguinte mensagem:

Errrrrrrrrrrroooooooooooooooooooonet.sf.jasperreports.engine.JRException: Error executing SQL statement for : usuarios

Olá ahdeerre,

Bom ao que indica seu erro você tem um erro na consulta do seu relatório, dah um revisada se o sql que você esta usando está correto e se retorna resultados.
Para verificar o StackTrace completo vá na pasta do seu server, lá provavelmente irá ter uma pasta “log” ai dentro dela possivelmente um “server.log” ou qualquer coisa configura um logger para sua aplicação responder tudo no console.

[quote=gustavo_l_walker]Olá ahdeerre,

Bom ao que indica seu erro você tem um erro na consulta do seu relatório, dah um revisada se o sql que você esta usando está correto e se retorna resultados.
Para verificar o StackTrace completo vá na pasta do seu server, lá provavelmente irá ter uma pasta “log” ai dentro dela possivelmente um “server.log” ou qualquer coisa configura um logger para sua aplicação responder tudo no console.[/quote]

Mas utilizando o mesmo relatorio, a mesma consulta e extamente tudo igual sem alterar nada diretamente no eclipse ele funciona normalmente. Esse erro ocorre apenas quando faço upload do .war para o servidor, e no servidor esta tudo igual, criei a mesma base de dados e as mesmas tabelas. Nesse processo de gerar o .war no eclipse e fazer o upload no servidor não ocorre nenhuma alteração certo?

Encontrei no server um arquivo que faz a mesma função da aba console do eclipse, e la descobri que sempre cai no catch.
Abaixo segue a classe que utilizo para gerar o relatorio:

package relatorios;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

public class RelatorioUsuarioSemParametro extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void processRequest(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException, Exception {
		
		Connection conn = getConnection();

        // gera o relatório
        ServletContext context = getServletContext();

        byte[] bytes = null;

        try{
        	// carrega os arquivos jasper
            JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(context.getRealPath("/WEB-INF/relatorios/usuarios.jasper"));
            // parâmetros, se houver
            Map parametros = new HashMap();
            // direcciona a saída do relatório para um stream
            bytes = JasperRunManager.runReportToPdf(relatorioJasper, parametros, conn);
            if (bytes != null && bytes.length > 0)
            {
                // envia o relatório em formato PDF para o browser
                response.setContentType("application/pdf");
                response.setContentLength(bytes.length);
                ServletOutputStream ouputStream = response.getOutputStream();
                ouputStream.write(bytes, 0, bytes.length);
                ouputStream.flush();
                ouputStream.close();
            }
        }catch (JRException jre){
        	System.err.println("Errrrrrrrrrrroooooooooooooooooooo" + jre);
        }
	}
	
	private static Connection getConnection() throws ClassNotFoundException, SQLException {
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/sistemas";
		String user = "root";
		String password = "******";
		
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, user, password);
		return con;
	}

	@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        try {
            processRequest(request, response);
        } catch (Exception ex) {
            Logger.getLogger(RelatorioUsuarioSemParametro.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (Exception ex){
            Logger.getLogger(RelatorioUsuarioSemParametro.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public String getServletInfo(){
        return "Short description";
    }

}

Uma vez li em algum lugar que não lembro mais onde foi que era necessário incluir um dos arquivos do ireport (não lembro se era o .jrxml ou o .jasper) no classpath da aplicação. O pior é que agora não encontro mais onde eu li isso. Sabe alguma coisa a respeito?

Olá,

Sim você tem que enviar junto o seu .jasper no seu caso ele deve ser empacotado assim como você está fazendo aqui:

Alêm disso existem os .jar do jasperreports, procura conhecer melhor o jasper que você vai entender o seu problema, até mesmo veja para debugar a sua aplicação para saber o stacktrace completo dela.

[quote=gustavo_l_walker]Olá,

Sim você tem que enviar junto o seu .jasper no seu caso ele deve ser empacotado assim como você está fazendo aqui:

Alêm disso existem os .jar do jasperreports, procura conhecer melhor o jasper que você vai entender o seu problema, até mesmo veja para debugar a sua aplicação para saber o stacktrace completo dela.[/quote]

Gustavo,

quando exportei minha aplicação para .war foram todos os arquivos, inclusive os arquivos .jasper .jrxml e as libs que o jasperreports utiliza. Conferi os arquivos que estão no servidor e todos se encontram lá, até tentei copiar os .jar do jasperreports para a pasta lib do tomcat (precisei fazer isso com a lib do mysql-connector para funcionar autenticação) e tambem não funcionou.
No eclipse fiz da seguinte forma, copiei os .jar para a pasta lib; criei um pacote relatorios para deixar as classes que chamam os relatorios; e criei um diretorio dentro de WEB-INF chamado relatorios para armazenar os .jasper e .jrxml
Dessa forma funcionou tranquilamente ao rodar a aplicação.
No servidor, fiz o deploy da aplicação para lá e conferi todos os arquivos, todos os diretórios, tudo esta da mesma maneira que no eclipse (somente mudou a extensão dos arquivos .java para .class) não entendo o que pode estar dando erro. Como te falei, a primeira vez que pesquisei sobre o jasper reports, vi que ao terminar de configurar os relatorios no iReport era necessário incluir um dos arquivos que não lembro qual (.jasper ou .jrxml) no classpath da aplicação. Entretanto, ontem passei um tempao procurando na internet sobre essa configuração e não achei nada.
O pior de tudo é que esse é o unico detalhe que ainda falta para poder utilizar o sistema.