Olá pessoal,
Sou novo no forum e no java, então ainda estou meio perdido aqui. Não consegui encontrar tópicos relacionados ao meu problema ou talvez eu não tenha conseguido pesquisar com eficiência, por isso estou postando, me perdoem caso exista, realmente não encontrei. Estou tentando desenvolver um projeto com JSF 1.2, usando também RichFaces e IReport 3.5. Estou usando o Eclipse Galileo. Estou com problemas na hora de gerar o relatório em pdf pelo browser usando o IReport, o relatório é mostrado normalmente porém os campos são preenchidos todos com “null” como se não houvessem dados, a view responsável pela pesquisa no banco de dados em oracle está fuincionando normalmente e estou carregando uma lista a partir dela, se eu carrego a lista em um RichTable consigo ver os dados, mas não no pdf. Os métodos estão funcionando normalmente, mas não sei se meu método no Bean está funcionando corretamente. Se alguem puder me ajudar colocarei meu código abaixo. Não sei se consegui explicar bem o problema, qualquer coisa perguntem. Agradeço desde já pela atenção.
Método no ManagerBean - Este está retornando erro de NullPointerException se rodado através de uma “main” porém não consegui descobrir o motivo, aparentemente não vi nada que pudesse gerar esse erro, está tudo inicializado
public String imprimir(){
RelatorioFornecedorDao rfd = new RelatorioFornecedorDao();
List<RelFornecedor> dados = null;
FacesContext context = FacesContext.getCurrentInstance();
InputStream relatorio = context.getExternalContext().getResourceAsStream("/fornecedor.jasper");
byte[] arquivo = null;
DataSourceFornecedor ds = null;
try{
dados = rfd.relatorio();
ds = new DataSourceFornecedor(dados);
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
arquivo = JasperRunManager.runReportToPdf(relatorio, null, ds);
String s = "inline; filename=relatorio.pdf";
response.setHeader("Content-disposition", s);
response.setContentLength(arquivo.length);
ServletOutputStream out = response.getOutputStream();
out.write(arquivo);
out.flush();
out.close();
}
catch (Exception e){
e.printStackTrace();
}
context.responseComplete();
return "ok";
}
Método da classe na camada de persistência(usando padrão DAO)
public List<RelFornecedor> relatorio(){
List<RelFornecedor> dados = new ArrayList<RelFornecedor>();
try{
abrirConexao();
stmt = con.prepareStatement("select * from saque_fornecedor");
rs = stmt.executeQuery();
while(rs.next()){
RelFornecedor rf = new RelFornecedor();
rf.setFornecedor(rs.getString("fornecedor"));
rf.setQuantia(rs.getDouble("quantia"));
rf.setData(rs.getString("data"));
rf.setNatureza(rs.getString("natureza"));
rf.setCentro_custo(rs.getString("Centro_custo"));
dados.add(rf);
dados.iterator();
}
}
catch(Exception e){
e.getMessage();
}
finally{
return dados;
}
}
Classe DataSource
public class DataSourceFornecedor implements JRDataSource{
private Iterator<RelFornecedor> dados;
private RelFornecedor f;
public DataSourceFornecedor(List<RelFornecedor> lista){
dados = lista.iterator();
}
public Object getFieldValue(JRField campo) throws JRException{
if (campo.getName().equals("Fornecedor")){
return f.getFornecedor();
}
if (campo.getName().equals("Quantia")){
return f.getQuantia();
}
if (campo.getName().equals("Data")){
return f.getData();
}
if (campo.getName().equals("Natureza")){
return f.getNatureza();
}
if (campo.getName().equals("Centro de Custo")){
return f.getCentro_custo();
}
return null;
}
public boolean next() throws JRException {
boolean resultado = false;
if (dados.hasNext()){
resultado = true;
f = dados.next();
}
return resultado;
}
}
Agradeço pela atenção de vocês!
Obs.: So como informação adicional, não sei se isso é importante ou vai ajudar em algo, mas a versão do jasper que estou usando é 1.3.4, o RichFaces é 3.3, JSF 1.2 e IReport 3.5 e estou usando o servidor Apache Tomcat 6.0, além de estar usando o Eclipse Galileo como IDE.