JSF com IReport dando erro

4 respostas
A

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.

4 Respostas

R

Sem o stacktrace fica dificil de ajudar.

fernandogodoy18

Amigo!

Leia este tópico!

Espero que te ajude!

A

Obrigado fernandogodoy18 vou estudar esse topico e ver se consigo resolver.

raf4ever, “stacktrace” você se refere a mensagem de erro? Se for, não está dando nenhuma mensagem de erro… o relatório apenas aparece com os campos escrito “null”, porém com a mesma quantidade de linhas q tenho em registro no banco.
É como se ele não estivesse associando os campos com os valores passados na lista.

fernandogodoy18

So pra reforçar!! Atualize sua versão do Ireport para a mais nova, se não me engano a 4.1
E confira se os fields e parametros do seu relatório se estão com os nomes de certos!!!

Criado 10 de março de 2011
Ultima resposta 11 de mar. de 2011
Respostas 4
Participantes 3