Boa tarde amigos.
Estou com um grande problema.
Estou migrando um sistema e trocando a persistência dos dados utilizando hibernate. Até aí tudo bem!
No sistema antigo os relatórios saem redondo e sem erros!
Porém, no sistema novo ainda não consegui gerar nenhum relatório.
Ainda não estou pegando dados reais, gerei alguns fictícios pra tentar ver o PDF na tela mesmo…
A classe que gera relatórios, estou utilizando os mesmo métodos e estrutura do sistema antigo. As bibliotecas, estou usando as mesmas. Quando o programa chega numa linha em específico, acontece nullpointerexception. Esta linha é: JasperRunManager.runReportToPdfStream(stream, servletOutputStream,parametros, fonteDados);
Reparei que a variável ‘stream’ sempre fica nula! Eu não sei mais o que fazer. Já teste várias bibliotecas, inseri e retirei do build path estas bibliotecas… Alguém tem uma dica por favor???
Vou postar minha classe, caso alguém já tenha passado por isso ou tenha o conhecimento e possa me ajudar. ( Erro acontece no método emitirRelatorioPdf() na linha 303. A variável ‘stream’ deveria ser preenchida na linha 278.)
Muito obrigado à todos.
–
Atenciosamente,
Michell Hornung.
package lh.report.action;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.ValidationException;
import lh.report.controller.ReportController;
import lh.report.model.Report;
import lh.security.model.User;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
/**
* Servlet reponsável por emitir todos os Relatórios em todos os formatos
* suportados.
*/
@WebServlet("/PrintReportAction")
public class PrintReportAction extends HttpServlet {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
private HttpServletResponse response;
private HttpServletRequest request;
public PrintReportAction() {
super();
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = null;
// Recupera os parametros
Integer id = Integer.parseInt(request.getParameter("id"));
String beginDateBR = request.getParameter("data_inicio");
String endDateBR = request.getParameter("data_final");
String interval = request.getParameter("interval");
String description = request.getParameter("description");
String orientationPage = request.getParameter("orientacao");
String name = request.getParameter("name");
String title = request.getParameter("title");
String tipo = request.getParameter("tipo_arquivo");
String cdApp = request.getParameter("cdApp");
User user = (User) request.getSession().getAttribute("sessionUser");
Report report = new ReportController().getReportByCod(cdApp);
String[][] dados = null;
String[][] legenda = null;
if (user == null) {
dispatcher = request.getRequestDispatcher("/report/logout.jsp");
dispatcher.forward(request, response);
} else {
this.response = response;
this.request = request;
try {
// Valida os parametros
if (id.equals("") || id == null)
throw new ValidationException(
"Por favor, selecionar relatório!");
if (interval.equals("") || interval == null)
throw new ValidationException(
"Por favor, informar intervalo!");
if (beginDateBR.equals("") || beginDateBR == null)
throw new ValidationException(
"Por favor, informar data inicial!");
// criar um vetor com valores ficiticios e somente depois emitir
// os pdfs ou xls.
legenda = new String[2][5];
legenda[0][0] = "MNEMONICO";
legenda[1][0] = "DESCRICAO";
// inicia o contador auxiliar
// e inicia o loop que deverá percorrer todos os itens da
// legenda
int posicaoLegenda = 1;
while (posicaoLegenda < 5) {
// Define os valores da legenda no array.
legenda[0][posicaoLegenda] = "MNEMONICO" + posicaoLegenda;
legenda[1][posicaoLegenda] = "DESCRICAO" + posicaoLegenda;
// incrementa o contador de posição do array
posicaoLegenda++;
}
dados = new String[25][5];
dados[0][0] = "hora";
dados[0][1] = "col1";
dados[0][2] = "col2";
dados[0][3] = "col3";
dados[0][4] = "col4";
for (int i = 1; i < 25; i++) {
dados[i][0] = "" + i;
dados[i][1] = "" + i;
dados[i][2] = "" + i;
dados[i][3] = "" + i;
dados[i][4] = "" + i;
}
// Gera o relatório no formato .xls - Excel
if ("xls".equals(tipo)) {
this.emitirRelatorioExcel(dados, legenda, orientationPage,
report.getNmLogo(), interval, title, description,
beginDateBR, endDateBR);
}
// Gera o relatório no formato .pdf
else if ("pdf".equals(tipo)) {
this.emitirRelatorioPdf(dados, legenda, orientationPage,
report.getNmLogo(), interval, title, description,
beginDateBR, endDateBR);
} else {
System.out.println("Invalido: " + tipo);
}
} catch (Exception e) {
request.setAttribute("error", e.getMessage());
e.printStackTrace();
}
}
}
private void emitirRelatorioExcel(String[][] dados, String[][] legenda,
String orientationPage, String string, String interval,
String title, String description, String beginDateBR,
String endDateBR) {
// TODO Auto-generated method stub
}
private void emitirRelatorioPdf(String[][] dados, String[][] legenda,
String orientationPage, String nmLogo, String interval,
String title, String description, String beginDateBR,
String endDateBR) throws JRException, IOException {
// recupera o numero de colunas existente no segundo
// parametro do campo data, esse valor deverá ser
// considerado o numero de colunas do relatório
int numeroDeColunas = dados[0].length - 1;
// Define o background do relatório baseado na escolha
// da orientação realizada pelo usuário.
String path_background;
if (orientationPage != null && orientationPage.equals("1")) {
path_background = getServletContext().getRealPath(
"/imagem/relatorios/topo_paisagem.jpg");
} else {
path_background = getServletContext().getRealPath(
"/imagem/relatorios/topo_retrato.jpg");
}
// Define os parametros do relatório
// Cria a instancia do HashMap de parametros do relatorio
HashMap<String, String> parametros = new HashMap<String, String>();
// Define os parametros basicos do relatório
parametros.put("TITULO_REL", title);
parametros.put("NOME_REL", description);
parametros
.put("DATA_INTERVALO",
(beginDateBR.equals(endDateBR) || "".equals(endDateBR) ? beginDateBR
: beginDateBR + " a " + endDateBR));
parametros.put("DATA", dados[0][0]);
parametros.put("LOGO", nmLogo);
parametros.put("BACKGROUND_TOPO", path_background);
// define os primeiros parametros do relatórios
for (int coluna = 1; coluna <= numeroDeColunas; coluna++) {
String nomeDaColuna = "";
if (coluna < 10)
nomeDaColuna = "COL0" + coluna;
else
nomeDaColuna = "COL" + coluna;
parametros.put(nomeDaColuna, dados[0][coluna]);
}
// define os primeiros parametros os parametros do relatórios
for (int coluna = 1; coluna <= numeroDeColunas; coluna++) {
String nomeDaColuna = "";
if (coluna < 10)
nomeDaColuna = "LEG0" + coluna;
else
nomeDaColuna = "LEG" + coluna;
if (nomeDaColuna.length() == 4)
nomeDaColuna = "0" + nomeDaColuna;
parametros.put(nomeDaColuna, legenda[0][coluna] + " = "
+ legenda[1][coluna]);
}
// Define a logo utilizada
parametros.put("LOGO", nmLogo);
// Define os dados do relatório
// A logica abaixo é composta por 2 loops.
// - O primeiro passa por todos os registros
// - O segundo passa por todas as colunas
ArrayList<HashMap><String, String>> dadosArrayList = new ArrayList<HashMap><String, String>>();
for (int i = 1; i < dados.length; i++) {
// HashMap responsável por armazenar temporáriamente
// as informações da linha do relatório, ele será agregado
// no final do loop ao array dados.
HashMap<String, String> record = new HashMap<String, String>();
// Define a data da linha do relatório
if (dados[i][0].contains("Total:")) {
record.put("DATA", dados[i][0].split(",")[1]);
} else {
if ("DD".equals(interval)) {
record.put("DATA", dados[i][0].replaceAll("00:00:00", ""));
} else {
record.put("DATA", dados[i][0]);
}
}
// Define os valores das colunas do relatório
for (int coluna = 1; coluna <= numeroDeColunas; coluna++) {
String nomeDaColuna = "";
if (coluna < 10)
nomeDaColuna = "COL0" + coluna;
else
nomeDaColuna = "COL" + coluna;
if (nomeDaColuna.length() == 4)
nomeDaColuna = "0" + nomeDaColuna;
record.put(nomeDaColuna, dados[i][coluna]);
}
// Verifica se o periodo é diferente de dias
// Caso sim, inicia o tratamento das informações para definir o
// agrupamento das informações no relatório...
if (!interval.equals("DD")) {
if (dados[i][0].contains("Total:")) {
record.put("GRUPO", dados[i][0].split(",")[0].trim());
} else {
record.put("GRUPO", dados[i][0].split(" ")[0]);
}
}
dadosArrayList.add(record);
}
// Define qual o template deve ser utilizado
String templatePath = getServletContext().getRealPath("/template/pdf");
InputStream stream = getClass().getResourceAsStream(templatePath);
// recupera o nome do relatório que será usado
// usando como base a quantidade de colunas do relatório
String parteNomeRelatorio = "";
if (numeroDeColunas < 10)
parteNomeRelatorio = "0" + numeroDeColunas;
else
parteNomeRelatorio = "" + numeroDeColunas;
if (orientationPage != null && orientationPage.equals("0")) {
stream = getServletContext().getResourceAsStream(templatePath + "/relatorio_" + parteNomeRelatorio + "col_retrato.jasper");
System.out.println("stream" + stream);
} else {
stream = getServletContext().getResourceAsStream(templatePath + "/relatorio_" + parteNomeRelatorio + "col_paisagem.jasper");
System.out.println("stream" + stream);
}
// Define o tipo de retorno no browser
response.setContentType("application/pdf");
// Inicia a geração do relatório
JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(
dadosArrayList);
ServletOutputStream servletOutputStream = response.getOutputStream();
JasperRunManager.runReportToPdfStream(stream, servletOutputStream,
parametros, fonteDados);
servletOutputStream.flush();
servletOutputStream.close();
}
}