Usando o JRBeanCollectionDataSource
Recebi vários emails perguntando sobre o Jasper/iReport. Recentemente fui questionado com relação ao JRBeanCollectionDataSource e o seu uso para gerar um relatório utilizando beans.
Mostrarei com um exemplo bem simples (sem sub-relatórios) como gerar um relatório com o Jasper usando o JRBeanCollectionDataSource como fonte de dados, irei fazer um relatório de livros.
OBS:
Em um outro tutorial eu tive o trabalho de criar um DataSource customizado, mas creio que é facilmente adaptado para usar somente o JRBeanCollectionDataSource, dispensando o DataSource customizado.
Na expressão para o sub-relatório teria que usar new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(${ListaDisciplinas})
O Fábio Miranda foi quem me questionou sobre esse uso do JRBeanCollectionDataSource, quando tiver mais tempo vou adaptar o tutorial com essas dicas. Me cobrem 😉
Foi utilizado o iReport 0.5.3, jdk1.5.0_03 e Windows XP
Primeiro vamos ao bean Livro
[sourcecode language=’java’]package exemplo;
public class Livro {
private String titulo;
private String autor;
private String isbn;
private String editora;
private String descricao;
public Livro(){}
// todos getters e setters omitidos} [/sourcecode]
O relatório é bem simples de ser desenhado, crie um novo relatório (menu File > new document) e insira os static text para os textos fixos ("Minha Biblioteca", "Titulo", "Autor", "ISBN", " Editora" e "Descricao") e 5 text fields que ficarão em frente aos static text "Titulo", "Autor", etc….
Quando você insere o text field o texto que aparece é $F{Field}, para mudar de um duplo clique sobre ele. Vai ser mostrado uma janela como essa:
Altere $F{Field} para $F{titulo} e faça isso com os outros 4 campos. Note que o texto $F{titulo} vai continuar em azul, isso ocorre porque não foi declarado o field titulo. O próximo passo é deixar $F{titulo} na cor verde. No menu View, selecione Report Fields. Na janela que será mostrada clique em New, preencha Field Name titulo, no Field Class Type selecione java.lang.String e no Field Description não coloque nada, clique em Ok. Repita a operação para autor, isbn, editora e descrição, como mostra a figura abaixo.
Uma relação importante a ser ressaltada é a dos atributos do bean <> Fields <> Text Fields, os nomes devem iguais como mostrado na figura abaixo.
No iReport como no Java maiúscula e minúscula fazem toda a diferença.
Compile o relatório, menu Build > Compile. Se aparecer algo parecido com isso no console o relatório está sem nenhum erro.
it.businesslogic.ireport.ReportClassLoader@1a73d30
Compilation running time : 260[/sourcecode]
Um dos erros mais comuns é esse
Errors compiling .Livros.jasper!
it.businesslogic.ireport.ReportClassLoader@e05ad6
net.sf.jasperreports.engine.JRException:
Report design not valid : 1. Field not found : Titulo
[/sourcecode]
Nesse caso o erro foi causado pelo “T” maiusculo, o certo é “t” minúsculo no TextField expression.
Ou se o "t" está minúsculo mas o erro continua, deve ser porque não foi declarado no Report Fields.
Agora iremos ver a classe que exibi o relatório. O diferencial está em azul, ao invés de utilizarmos uma
Connection vamos usar o JRBeanCollectionDataSource.
[sourcecode language=’java’]package exemplo;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;
public class Inicio {
public void exibirRelatorio() {
// Caminho do .jasper do relatorio
String caminhoRelJasper = “Livros.jasper”;
// Lista com beans
List listaLivros = getLivros();
// Stream com o .jasper
InputStream relJasper = getClass()
.getResourceAsStream(caminhoRelJasper);
// O datasource
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
listaLivros);
// Parametros do relatorios
Map parametros = new HashMap();
JasperPrint impressao = null;
try {
impressao = JasperFillManager.fillReport(relJasper, parametros, ds);
JasperViewer viewer = new JasperViewer(impressao, true);
viewer.setVisible(true);
} catch (JRException e) {
System.out.println(e.getMessage());
}
}
public List getLivros() {
List listaLivros = new ArrayList();
Livro livro = new Livro();
livro.setTitulo(“Use a cabeça! Padrões de Projeto – Design Patterns”);
livro.setAutor(“Freeman, Eric / Freeman, Elisabeth”);
livro.setIsbn(“8576080869”);
livro.setEditora(“Alta Books”);
livro
.setDescricao(“Como você sabe que não quer reinventar a roda (ou, ”
+ “pior, um pneu furado), ”
+ “então você busca padrões de projetos”);
listaLivros.add(livro);
livro = new Livro();
livro.setTitulo(“Entendendo e Dominando o Linux”);
livro.setAutor(“Morimoto, Carlos”);
livro.setIsbn(“8589535339”);
livro.setEditora(“Digerati”);
livro
.setDescricao(“Como o nome diz, este livro é uma obra destinada a ”
+ “todos aqueles que ”
+ “pretendem conhecer na prática e em detalhes os ”
+ “principais recursos oferecidos pelo Linux”);
listaLivros.add(livro);
livro = new Livro();
livro.setTitulo(“Guia de Certificação em Java – Exame CX-310-035”);
livro.setAutor(“Pereira, Rafael”);
livro.setIsbn(“8573934263”);
livro.setEditora(“Ciência Moderna”);
livro.setDescricao(“Este Guia de Certificação em Java é um livro ”
+ “fundamental para preparar os”
+ ” candidatos ao exame de programador Java da Sun, ”
+ “a primeira e mais ”
+ “requisitada certificação desta tecnologia.”);
listaLivros.add(livro);
return listaLivros;
}
public static void main(String[] args) {
new Inicio().exibirRelatorio();
}
}
[/sourcecode]
É isso que eu queria passar… em caso de dúvida me mande um email, assim vou poder melhorar esse tutorial.
Download do código fonte
Veja também meu artigo na Java Magazine sobre iReport.
E ae blz? para melhorar um pouco mais o seu tutorial vc poderia setar o classpath do iReport com os seus .class dos beans assim vc nao precira criar os fields na mao basta carregar os campos e chamá-los sem se preocupar e dar os nomes iguais e sem precisar declará-los na sua classe controller. Ou isso, deixa o iReport independente do java, pois ele soh irá cuidar do layout. Veja com mais detalhes na url abaixo no ultimo post.
http://javafree.uol.com.br/topic-870555-RelatorioHibernate+Annotations+JSF+iReportindex
Me add ae no talk para trocarmos umas ideias, e parabéns pelo tutorial, flw!
Olá,
estou tentando usar JasperViewer mas sua saida é somente na maquina do servidor e não sai no cliente .
Tem como fazer pra sair no cliente se puder me ajudar agradeceria…
abs
Em ambiente web é mais recomendado que você gere um PDF e disponibilize para o usuário baixar.
Caro Roberto,
No seu exemplo como você retorna uma List o mapeamento com os fields do JasperReport se dá pelos nomes das propriedades. propriedade=textFields, ouja, autor=$F{autor}. Como faria o mapeamento no caso de uma List? Estou usado o JPA para fazer consultas ao banco. Por exemplo: List listaNome = em.createQuery(“select p.id as id, p.nome as nome from Pessoa p”).getResultList();
Se eu usar: JRBeanCollectionDataSource sourcePessoa = new JRBeanCollectionDataSource(listaNome); ou
JRBeanArrayDataSource sourcePessoa = new JRBeanArrayDataSource(listaNome.toArray());
e no relatório tentar obter os campos $F{id} e $F{nome} obtenho a exception: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : id, devido: Caused by: java.lang.NoSuchMethodException: Unknown property ‘id’.
Agradeço pela ajuda! Isto está atrasando minha tarefa.
Olá
Nunca trabalhei apenas com uma List de Long ou Integer, sempre usei com uma classe Entidade (Pessoa.id por exemplo). No seu problema é melhor retornar uma List de Pessoas ai no relatório você usa $F{pessoa.id} ao invés de $F{id}
Olá, tive o mesmo problema com:
“java.lang.NoSuchMethodException: Unknown property ””
No relatório eu estava utilizando um field do tipo Integer e tinha aplicado uma formatação utilizando a opção FieldPattern para #####0.
Apesar de não ter nenhum registro null, estava tomando o erro…
Tirei o pattern e funcionou!
Felizmente este campo realmente não precisava de formatação…
Roberto, no caso da query:
List listaNome = em.createQuery(”select p.id as id, p.nome as nome from Pessoa p”).getResultList();
Como faço o mapeamento já que cada linha(row) é um array de objetos e não uma propriedade de uma entidade??
Olhando o JRJpaDataSource existe uma padrão:
Fields are mapped to values in the result following these rules:
* if the query returns a single object/bean (e.g. SELECT m FROM Movie m or SELECT NEW MovieDescription(m.title, m.genre) FROM Movie m), then the fields are mapped to bean property names.
* if the query returns multiple objects per row (e.g. SELECT m.title, m.gender FROM Movie m), the fields are mapped using the following syntax: COLUMN_index[.property], with the indexes starting from 1. Example mappings: COLUMN_1, COLUMN_2, COLUMN_2.title, COLUMN_2.movie.title.
O mesmo existe para o JRBean[Collection|Array]DataSource ? Seria possível resolver o me problema usando JRJpaDataSource ? Tenho procurado exemplos de como o usar mas apenas exemplos passando a conexão para o Jasper.
Agradeço muito a ajuda!
Caro Roberto, estou lhe enviando a solução que implementei. Obrigado pela ajuda!
Criei uma especialização do JRDataSource. Veja o código abaixo.
public class JRArrayDataSource implements JRDataSource {
private Iterator iterator;
private Object[] cursor;
private int indice;
public JRArrayDataSource(List array) {
super();
iterator = array.iterator();
}
public Object getFieldValue(JRField jrField) throws JRException {
indice++;
if (indice < cursor.length) {
return cursor[indice];
}
return null;
}
public boolean next() throws JRException {
boolean retorno = iterator.hasNext();
if (retorno) {
cursor = iterator.next();
indice = -1;
}
return retorno;
}
}
O que faço aki é iterar a Lista e depois passar ir lendo o array e retornando o valor.
O importante é observar a sequencia dos campos no relatório. A ordem de criação deve bater com a ordem dos elementos no array, aí o mapeamente é feito sem problemas.
Veja o código da geração do relatório abaixo:
public static void gerarRelatorio() throws JRException {
List array = new ArrayList();
array.add(new Object[]{new Integer(1), “Alessandro Moreira”, “Caldeirão Furado, 13”, “32321010”});
array.add(new Object[]{new Integer(2), “Wolverine”, “Escola Xavier, X”, “55551234”});
JRArrayDataSource arrayDataSource = new JRArrayDataSource(array);
JasperPrint print = JasperFillManager.fillReport(“relatorio/relatorioCliente.jasper”, new HashMap(), arrayDataSource);
JasperViewer view = new JasperViewer(print);
view.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
view.setSize(500, 600);
view.setLocationRelativeTo(null);
view.setVisible(true);
}
Obrigado Alessandro pela contribuição.
Quando tento executar sua classe inicio ela esta gerando a excecao:
Error loading object from InputStream
net.sf.jasperreports.engine.JRException: Error loading object from InputStream
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:200)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
at Inicio.exibirRelatorio(Inicio.java:46)
at Inicio.main(Inicio.java:99)
Caused by: java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 10101, local class serialVersionUID = 10200
at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:196)
É bem provável que o caminho pro arquivo .jasper está errado, logo ele não consegue carrega-lo.
Eu nunca vi esse erro. As versões do jasperreports.jar são as mesmas? Você compila e executa com as mesmas libs no classpath?
Não é o caminho, já testei isso… Tem alguma outra ideia??
Então, sem analisar com mais detalhes é dificil dizer o que pode ser. Faça um debug linha a linha para descobrir o que gera a exception.
Olá Roberto Furutani,
o seu tutorial realmente eh muito bom,
porém nao consegui fazer o que eu estava querendo realmente,
me deram uma missao de eu usar o ireport e fazer um select pela aplicação e representar num relatorio.
o método que gera ta assim:
public JasperPrint gerar() throws ExcRepositorio{
JasperPrint rel = null;
try {
System.out.println(“Entrou no jasper”);
Connection con = gConexao.getConnection();
System.out.println(“abriu conexao de novo”);
HashMap map = new HashMap();
String descricao = (String) map.get(“descricao”);
String arquivoJasper = “C:/java/Relatorio/src/tujura.jasper”;
System.out.println(“A String que ta passando: \n” + arquivoJasper);
rel = JasperFillManager.fillReport(arquivoJasper, map, con);
System.out.println(“Passou aki eh beleza, o jasper recebeu”);
JasperExportManager.exportReportToPdfFile( “tujura.jrprint” );
} catch (JRException e) {
System.out.println(“passou aqui significa erro”);
JOptionPane.showMessageDialog(null,e.getMessage());
}
return rel;
}
e retorna isso de erro:
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/digester/Rule
at net.sf.jasperreports.components.ComponentsExtensionsRegistryFactory.(ComponentsExtensionsRegistryFactory.java:87)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
Alguma ideia ?
obrigado!
olá Bruno,
Está faltando no seu classpath o arquivo commons-digester.jar ele vem junto com o ireport na pasta lib.
Cintia, também estou com o mesmo problema e não consigo identificar o erro. Você pode me dizer se conseguiu resolver e como eu posso resolver o meu problema.
Furutani, você pode dar alguma sugestão para a solução do problema.
Grato,
Jeremias Araujo
Excelente, esto resolvió mi problema
Muchas Gracias !!!!!!!!!!!!!!
Pingback: Introdução a relatórios crosstab com iReport/JasperReports » Roberto Furutani
Bom dia,
precisava de repetir a impressão de um report N vezes com a mesma informação, isto é, imprimir 1 de N, 2 de N, … N de N etiquetas com os mesmos dados.
Alguém sabe como posso fazê-lo no ireport?
Obrigada
Bom dia Cristina, uma forma que vejo de fazer isso é popular o DataSource com N vezes a mesma informação. Não vi nada que facilite a criação de etiquetas no ireport.
Caro Roberto,
Tentei compilar o seu codigo pra testar, mas está dando o seguintre erro:
run:
Exception in thread “main” java.lang.NullPointerException
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
at java.io.ObjectInputStream.(ObjectInputStream.java:280)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:191)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
at Inicio.exibirRelatorio(Inicio.java:38)
at Inicio.main(Inicio.java:90)
Java Result: 1
Não sei mais o que fazer.
Já tentei verificar o caminho, mas não é. Ná hora que ele chama a impressão está dando erro.
Aguardo soluções para este caso.
Ele não encontra o arquivo jasper. Faça um debug e se ele está buscando no caminho certo, se estiver trabalhando com diretórios diferentes para os fontes e binários, verifique se o arquivo está no diretório dos binários.
Correcto, obrigada!
Bom noite, lhe desejo os parabéns pelo tutorial.
Tentei adaptar as classes java para gerar em ambiente web, sendo visualizado em pdf, mas ocorreu o seguinte erro:
java.lang.NullPointerException
net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:138)
net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:83)
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdf(JasperRunManager.java:419)
rInicio.doGet(rInicio.java:103)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419)
org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:133)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
O arquivo jasper é o que baixei junto com as classes java.
Obrigado pela atenção
Olá,
Primeiro: parabéns pelo tutorial.
Segundo: Meu relatório tem vários datasets com origem “JavaBean DataSource”. Como faço o .java para chamar o relatório?
Sei que se fosse apenas um DataSet deveria chamar assim:
jasperPrint = JasperFillManager.fillReport(stream, params, new JRBeanCollectionDataSource(data));
Meu problema é quando tem vários CoolectionBeanDataSource
Olá
O data source é um por relatório. O que vc pode tentar fazer é passar os outros data sources dentro de outro data source.
Fica meio bagunçado.
Cara, valeu pelo tutorial.
Me ajudou muito aki.
abraço
Muito obrigado, me ajudou bastante.
Pegando o teu exemplo, como mostrar os registos agrupados?
E sobre JRXmlDataSource?
Abraço?
Bom dia, parabéns pelo tutorial me auxiliou muito, tenho a seguinte dúvida quanto a disponibilização pelo JRBeanCollectionDataSource, quando tenho uma lista com objetos que contém outros objetos dentro dela, como faço para retornar os valores desses “sub-objetos” para o relatório, agradeço desde já.
Olá, você pode navegar pelos objetos com ponto. Exemplo: ($F{meuField}).getObj().getValor(). Tome cuidado para não tomar um NullPointerException.
Muito obrigado, funcionou.
Os meus fields de uma lista de Matrículas estão desta forma:
Nenhum dos dois aparece no relatório! tenho que mencionar Matrículas em algum lugar para que o .jrxml entenda que são campos de uma matrícula?
Valeu!
Se a lista de Matrículas servir de datasource para o relatório basta criar um JRBeanCollectionDataSource com ela e passar pro relatório, não precisa referenciá-lo no ireport
Boa noite, estou usando o netbeans 6.8 com ireport 3.7.5, ja consegui criar os relatorios, mas nao sei como chama-los de dentro da minha aplicação, copiei alguns modelos mas não funcionou.
ele pede para criar a classe
JRResultSetDataSource e JasperPrint no pacote
Boa noite Roberto, estou montando um relatorio, mais a saida só esta no servidor e não no cliente. Segue abaixo o codigo.
Ver se tem como me ajudar.
public JasperPrint doGerarRelatorio() throws ExcRepositorio, JRException, SQLException{
String query = “”;
JasperPrint impressao = null;
Connection conn;
try {
query = “SELECT diasfa.`DATAMOVTO` AS diasfa_DATAMOVTO, “;
query = query + “diasfa.`HRFINAL` AS diasfa_HRFINAL, “;
query = query + “diasfa.`HRINICIAL` AS diasfa_HRINICIAL, “;
query = query + “diasfa.`HRINTERVALO` AS diasfa_HRINTERVALO, “;
query = query + “diasfa.`HRTOTAL` AS diasfa_HRTOTAL, “;
query = query + “atividade.`VLCLIENTE` AS atividade_VLCLIENTE, “;
query = query + “participante.`NOMEFANTASIA` AS participante_NOMEFANTASIA, “;
query = query + “usuario.`APELIDO` AS usuario_APELIDO “;
query = query + “FROM `atividade` atividade INNER JOIN `diasfa` diasfa ON atividade.`id` = diasfa.`ATIVIDADE_id` “;
query = query + “INNER JOIN `fichaaprop` fichaaprop ON diasfa.`FICHAAPROP_id` = fichaaprop.`id` “;
query = query + “INNER JOIN `projeto` projeto ON fichaaprop.`PROJETO_id` = projeto.`id` “;
query = query + “INNER JOIN `usuario` usuario ON fichaaprop.`USUARIO_id` = usuario.`id` “;
query = query + “INNER JOIN `participante` participante ON projeto.`PARTICIPANTE_id` = participante.`id` “;
query = query + “WHERE usuario.`id` = “+idUsuario;
query = query + “ORDER BY usuario.`APELIDO` ASC, participante.`NOMEFANTASIA` ASC, diasfa.`DATAMOVTO` ASC”;
// PreparedStatement pstmt = DB.
conn = ConectaBanco.getConexao();
InputStream reportStream = this.getServletContext().getResourceAsStream(“/WEB-INF/protected/relatorios/admProjetos/HoraApontadas.jasper”);
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(query);
JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
HashMap map = new HashMap();
JasperReport rel = (JasperReport)JRLoader.loadObject(reportStream);
impressao = JasperFillManager.fillReport(rel, map, jrRS);
JasperViewer visualizador = new JasperViewer(impressao, false);
visualizador.setVisible(true);
} catch (ExcRepositorio ex) {
Logger.getLogger(Notasfiscais.class.getName()).log(Level.SEVERE, null, ex);
}
return impressao;
}
Obrigado.
Olá Fernando
Em uma aplicação web não é possivel usar o JasperViewer, o fazemos é exportar para um formato que o usuário possa baixar para sua máquina, o mais comum é o PDF.
Aqui tem um exemplo de como fazer isso.
Roberto estou com o mesmo problema q a cintia citou acima;
net.sf.jasperreports.engine.JRException: Error loading object from InputStream
ele encontra meu relatorio quando eu dou um :
viewer.show();
para ele exibir o relatorio ele exibe…mais nao vai na hora de exibir em pdf.
olá belo topico, estou com um probleminha, estou tendo que gerar relatorio usando duas listas de objetos diferentes, tentei assim mas não deu certo
[code]JasperPrint preencher = JasperFillManager.fillReport(pathReport, null, new JRBeanCollectionDataSource(relatoriosOs));
preencher = JasperFillManager.fillReport(pathReport, null, new JRBeanCollectionDataSource(tiposDeServico));[/code]
como posso fazer?
Ola, dessa forma não vai funcionar. Você precisa colocar uma lista dentro da outra e dentro report fazer o tratamento para cada uma delas. Acredito que com 2 subreports você resolva seu problema
tem algum tutorial que voce conheça para me auxiliar?
grato pela ajuda
Tenho um aqui no site e
tem esse tutorial do David http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/
T+
Roberto Furutani,
Parabéns pelo Tutorial…
Estou a dias pesquisando sobre um erro ao gerar o relatório pelo .jasper, e não encontro nada satisfatório a respeito.Peço URGENTEMENTE sua ajuda.
Meu .jasper gera o relatório perfeito no Ireport 4.5.0, mas quando eu o coloco na projeto na pasta src, ele gera o seguinte erro:
net.sf.jasperreports.engine.JRException: java.net.MalformedURLException
Estou fazendo assim:
FacesContext contexto = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) contexto.getExternalContext().getResponse();
ServletOutputStream responseStream = response.getOutputStream();
//URL caminho = getClass().getResource(“../RelatorioOmissao.jasper”);
InputStream caminho = getClass().getResourceAsStream(“../RelatorioOmissao.jasper”);
JasperReport pathReport = JasperCompileManager.compileReport(caminho);
@SuppressWarnings(“rawtypes”)
HashMap map = new HashMap();
JasperPrint preencher = JasperFillManager.fillReport(pathReport,map,new JRBeanCollectionDataSource(listaObjOmissao));
JasperExportManager.exportReportToPdfStream(preencher, responseStream);
System.out.println(“gerou todo pdf”);
//JasperViewer.viewReport(preencher);
response.setContentType(“aplication/pdf”);
response.setHeader(“Content-Disposition”,”attachment;filename=\”RelatorioOmissao.pdf\””);
responseStream.flush();
responseStream.close();
contexto.renderResponse();
contexto.responseComplete();
Mesmo tentando vizualiza-lo no proprio navegador ou pelo
JasperView o erro persiste.
Please….aguardo respostas….
Eduardo Alves
eduardimaa@gmail.com
Valeu, brigadão! Ajudou bastante aqui… abraço!
Esse post me sanou muitas dúvidas. Valeu!
Ola Roberto, não sei se vc se lembra desse post, mas talvez possa esclarecer mina duvida, eu quero saber como faço para passar o JRBeanCollectionDataSource com um total de dados e filtrar no relatório o que será exibido, EX: tenho um relatório nele mando uma lista com todas as cidades, e no sub relatório quero que mostre as pessoas que moram em cada cidade, só que eu mando a lista completa de pessoas, existe um modo de fazer isso?
Olá, eu não sei se é possível fazer isso passando os dados brutos pro jasper e ele filtrar os dados.
Eu faria o filtro na aplicação e passaria o JRBeanCollectionDataSource só com os dados que eu quero que apareça.
Boa Noite, estou fazendo tudo igual, está apresentado esse err, Poderia me ajudar!
Ago 18, 2016 9:33:54 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
ADVERTÊNCIA: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
Ago 18, 2016 9:33:54 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
ADVERTÊNCIA: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
Ago 18, 2016 9:33:55 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
ADVERTÊNCIA: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
Exception in thread “main” net.sf.jasperreports.engine.JRException: java.net.MalformedURLException
at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:305)
at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:284)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:273)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:247)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:338)
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:605)
at relatoriomedicos.RelatorioMedicos.RelatorioComb(RelatorioMedicos.java:113)
at Model.Conexao.consultaRQ3(Conexao.java:203)
at Model.Conexao.main(Conexao.java:213)
Caused by: java.net.MalformedURLException
at java.net.URL.(URL.java:619)
at java.net.URL.(URL.java:482)
at java.net.URL.(URL.java:431)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:616)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
at org.apache.commons.digester.Digester.parse(Digester.java:1892)
at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:297)
… 8 more
Caused by: java.lang.NullPointerException
at java.net.URL.(URL.java:524)
… 19 more
eu não sei o que é.