Bonjour,
j'ai créé iReport un rapport contenant 3 sous-rapports. La source de données de se rapport est un bean.
j'ai donc créé une classe MyBeanDataSource :
public MyBeanDataSource extends JRAbstractBeanDataSource {
public static Object createData() {return bean}
}
Les sources de données des 3 sous-rapports sont également des bean. Nous avons donc 3 classes :
public MySubReportBeanDataSource1 extends JRAbstractBeanDataSource {
public static List createCollection() {return list}
}
public MySubReportBeanDataSource2 extends JRAbstractBeanDataSource {
public static List createCollection() {return list}
}
public MySubReportBeanDataSource3 extends JRAbstractBeanDataSource {
public static List createCollection() {return list}
}
Lors de la création du rapport, j'ai déclaré les différents paramètres que je vais envoyer dans la Map params. Dedans on y retrouve nos 3 DataSource pour les sous-rapport. A la création des sous-rapport dans iReport, j'ai sélectionné dans la liste déroulante
(cliquer sur le sous-rapport : propriété=>rapport secondaire) "Expression de connexion/source de donné" la valeur "Utiliser l'expression de source de donnée", puis je lui affecte la valeur du paramètre passé dans la Map params.
public Edition {
fillReport() {
// Chargement du report
URL urlReport = URL url = instance.getClass().getResource("report.jasper");
URL urlSubReport1 = URL url = instance.getClass().getResource("sub_report1.jasper");
URL urlSubReport2 = URL url = instance.getClass().getResource("sub_report2.jasper");
URL urlSubReport3 = URL url = instance.getClass().getResource("sub_report3.jasper");
//DataSource
MyBeanDataSource ds_report = new MyBeanDataSource() ;
MySubReportBeanDataSource1 ds_subReport1 = new MySubReportBeanDataSource1() ;
MySubReportBeanDataSource2 ds_subReport2 = new MySubReportBeanDataSource2() ;
MySubReportBeanDataSource3 ds_subReport3 = new MySubReportBeanDataSource3() ;
// désérialisation du raport
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(urlRepport.getPath());
Map params = new HashMap() ;
params.put("SUBREPORT1", urlSubReport1.getPath()) ;
params.put("SUBREPORT2", urlSubReport2.getPath()) ;
params.put("SUBREPORT3", urlSubReport3.getPath()) ;
params.put("DS_SUBREPORT1", ds_subReport1) ;
params.put("DS_SUBREPORT2", ds_subReport1) ;
params.put("DS_SUBREPORT3", ds_subReport1) ;
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds_report);
return JasperExportManager.exportReportToPdf(print);
}
}
Lorsque je teste le résultat j'obtiens un NullPointerException dans la classe JRPropertiesMap à l'appel de la méthode readObject qui désérialise l'objet report :
Exception in thread "main" java.lang.NullPointerException
at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185)
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
if (propertiesList == null)// an instance from an old version has been deserialized
{
//recreate the properties list and map
propertiesList = new ArrayList(propertiesMap.keySet()); // LIGNE CAUSANT LE NULLPOINTEREXCEPTION !!!!!!
propertiesMap = new HashMap(propertiesMap);
}
}
J'ai l'impression qu'il y a eu un problème lors de la compilation du rapport sour iReport, et que dans le fichier jasper de sortie, la variable d'instance propertiesMap a été mal sérialisée. Mais je n'arrive pas à voir pourquoi.
Si l'un d'entre vous peut me donner un coup de main, je l'en remercie d'avance car je suis à court d'idée.
@+
Partager