Tenho trabalhado num relatório Jasper em que a fonte de dados (DataSource) é um coleção Java, especificamente uma lista (List) carregada no código por um objeto JRBeanCollectionDataSource. Essa lista é gerada a partir de um método que faz uma consulta no banco de dados (utilizo JPA/Hibernate + MySQL), como exemplificado no código abaixo:
[code]
public Class DataSource{
//definicoes da classe
public static List constructDataSource() throws Exception{
List dataSource = new ArrayList();
MeuObjeto meuObjeto = utilitarioJPA.getObjetoPorId(10);
dataSource.add(meuObjeto);
return dataSource;
}
}[/code]
O problema está na confecção do relatório no iReport: eu tentei criar uma nova DataSource, utilizando um JavaBean com o método estático acima que deve retornar a coleção. Mas sempre que eu tento testar a conexão o iReport acusa o seguinte erro:
NoClassDefFoundError!!
Check your classpath!
Could not initialize class dataSource.DataSource!!
Antes, mostra um erro semelhante só que com JPA. Já coloquei o .jar do projeto que contém o JavaBean e da biblioteca toplink-essentials.jar no CLASSPATH do iReport, mas não surtiu efeito.
Eu consegui resolver a questão do ClassNotFound com algumas configurações no CLASSPATH do iReport. Entretanto, agora tenho um outro problema: quando tento criar o JavaBeans set datasource, o resultado retornado é null. O método estático usado para fornecer a coleção ao data source é semelhante a este:
[code]public static List getDataSourceCollection{
return databaseUtility.listAllObjects();
}
[/code]
Esse método utiliza JPA para fazer uma consulta no banco e retornar a lista de objetos que eu preciso para preencher o relatório.
Agora se eu fizer o método como em todos os tutoriais que encontrei, o data source é criado tranquilamente:
[code]public static List getAnotherDataSource(){
List aList = new ArrayList();
DadoMunicipio dado1 = new DadoMunicipio("Populacao total", 48484884);
DadoMunicipio dado2 = new DadoMunicipio("Populacao Rural", 3535353);
DadoMunicipio dado3 = new DadoMunicipio("Populacao Urbana", 3535353);
aList.add(dado1);
aList.add(dado2);
aList.add(dado3);
return aList;
}[/code]
Então a questão está justamente na consulta ao banco. O problema é que esse é único meio que tenho para buscar os dados do relatório. Alguém teria alguma sugestão?
Eu consegui dar prosseguimento ao desenho do relatório no iReport utilizando, como datasource, uma coleção simples, estática, que não faz conexão com o banco para obter os objetos.
Já no código Java, para gerar o relatório final, eu uso o JasperReports para preencher a coleção, com objetos advindos do banco de dados.