Boa tader.
Estou com o seguinte cenario:
Fiz uma aplicação web que deveria gerar um arquivo pdf para o usuário ao final de um conjunto de procedimentos.
Acontece que a aplicação gera o arquivo pdf somente quando eu a roda no meu computador local, nesse computador eu estou usando windows. Porém quando faço deploy para o servidor linux e roda a aplicação, eu não conseigo mais gerar o arquivo pdf. Eu recebo a mensagem "javax.servlet.ServletException: java.lang.NullPointerException: Erro de argumento: O parâmetro message é nulo"
Abaixo eu estou colocando o código e o erro completo. Obrigado a quem puder ajudar.
[code]
Minha view
<h:form>
<h:commandLink action="#{relatorioController.relGuiaRecibo}" rendered="#{relatorioController.atendimentoController.atendimentoCorrente.tipoAtendimento eq ‘Particular’}“
title=“Imprimir Recibo”>
<h:graphicImage name=“printer.png” library=“imagens”/>
<f:setPropertyActionListener target=”#{relatorioController.nomeArquivoGerador}"
value=“reciboatendimento” />
</h:commandLink>
<h:commandLink action="#{relatorioController.relGuiaAtendimento}" rendered="#{relatorioController.atendimentoController.atendimentoCorrente.tipoAtendimento eq 'Contrato'}"
title="Imprimir Guia de Atendimento">
<h:graphicImage name="printer.png" library="imagens"/>
<f:setPropertyActionListener target="#{relatorioController.nomeArquivoGerador}"
value="reciboguiaatendimento" />
</h:commandLink>
</h:form> [/code]
Meu controller
private final ReportFactory pb = new ReportFactory();
public void relGuiaAtendimento() {
Atendimento atendimento = atendimentoController.getAtendimentoCorrente();
Map<String, Object> params = new HashMap<String, Object>();
params.put("ID_ATENDIMENTO", atendimento.getId());
byte[] file = pb.geraRelatorio(nomeArquivoGerador, params);
if (file != null) {
buildResponse(file,nomeArquivoGerador);
} else {
FacesMessage message = new FacesMessage("Array de bytes nulo. Não foi possível gerar o relatório...");
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
public void relGuiaRecibo() {
Atendimento atendimento = atendimentoController.getAtendimentoCorrente();
Map<String, Object> params = new HashMap<String, Object>();
params.put("ID_ATENDIMENTO", atendimento.getId());
byte[] file = pb.geraRelatorio(nomeArquivoGerador, params);
if (file != null) {
buildResponse(file,nomeArquivoGerador);
} else {
FacesMessage message = new FacesMessage("Array de bytes nulo. Não foi possível gerar o relatório...");
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
public void buildResponse(byte[] data, String out) {
System.out.println("entrou aqui................");
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "attachment; filename=\" " + out + " .pdf\"");
OutputStream output;
try {
output = response.getOutputStream();
output.write(data);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
facesContext.responseComplete();
}
Factory do relatorio
public class ReportFactory {
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("ergoclinWeb");
private static EntityManager em;
public ReportFactory() {
if (em == null) {
em = emf.createEntityManager();
}
}
public byte[] geraRelatorio(String nome, Map<String, Object> params) {
String nomeRelatorio = nome + ".jasper";
return constroiRelatorio(nomeRelatorio, params);
}
public byte[] constroiRelatorio(String nome, Map<String, Object> params) {
String diretorioRelatorio = "/reports/";
InputStream is = getClass().getResourceAsStream(diretorioRelatorio + nome);
System.out.println("caminho do arquivo " + is);
try {
JasperPrint fillReport = JasperFillManager.fillReport(is, params, getConnection());
System.out.println("gerou o file................");
return JasperExportManager.exportReportToPdf(fillReport);
} catch (JRException e) {
e.printStackTrace();
}
return null;
}
private Connection getConnection() {
Session session = (Session) em.getDelegate();
Connection connection = null;
try {
connection = ((SessionFactoryImplementor) session.getSessionFactory()).getConnectionProvider()
.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}