Voilà, on m'a demandé de créer un nouveau rapport sur une application web où il existe déjà des rapports, je me suis donc basé sur l'un des rapports existants pour créer ce qu'il me fallait, je précise que le rapport et les sous-rapports que j'ai pris comme modèles FONCTIONNENT.
Avec un peu d'inverse engineering, j'ai compris que l'application créait des listes d'objets correspondant à chaque sous rapport (ça c'est dans mon Action) :
la beanList contient la liste des listes d'objets pour les sous-rapports (stagiaireList ne contient que le stagiaire, à la rigueur, je pourrais supprimer ce sous-rapport en l'intégrant directement au rapport principal) et realPath est une partie du chemin d'accès aux fichiers jasper (le path sera complété dans ReportBuilder).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 beanList.add(stagiaireList); beanList.add(periodeStageList); beanList.add(formationList); beanList.add(evenementList); beanList.add(fraisInscriptionList); ReportBuilder.buildReport( beanList, realPath, response);
Dans ReportBuilder, on créé une liste de paramètres et on lui transmet les informations qui devront être affichées par le rapport principal :
Puis on parcourt la beanList récupérée en paramètre. Pour chaque liste contenue dans la beanList, on va automatiquement générer le chemin d'accès au fichier jasper correspondant, grâce au nom du type d'objet de la liste (ouais c'est un peu tiré par les cheveux mais j'ai vérifié et les noms concordent).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Map parameters = new HashMap(); parameters.put("ReportTitle", "titre"); parameters.put("ImagePath", "img");
on appelle ensuite la méthode suivante :
Où list est la liste des objets qui sera utilisée par le sous-rapport pour afficher les informations, parameters est la map de paramètres à passer au rapport principal, sourceFileName est le chemin d'accès complet au fichier jasper du sous-rapport et param est le nom du type d'objet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public static void editSubReport(List list, Map parameters, String path, String param) throws Exception { final JRDataSource subReportSource = new FractalBeanCollectionDataSource(beanList); parameters.put(param + "SubReportSource", subReportSource); final JasperReport jasperReport = JasperManager.loadReport(path); parameters.put(param + "SubReport", jasperReport); }
Et une fois la liste parcourue et tous les sous-rapports chargés, avec les données, dans la map parameters, on lance l'export du rapport principal.
Le problème, c'est que j'arrive jamais là, l'application lance une exception à la ligne
final JasperReport jasperReport = JasperManager.loadReport(path); où il charge le premier sous-rapport.
J'utilise Eclipse 3.1, l'application tourne sur un serveur Tomcat 5.0, la version du jar jasper report est 0.6.0 (ouais c'est vieux mais j'vais pas risquer d'upgrader vu que tous les autres rapports de l'application fonctionnent) et j'ai compilé les rapports avec iReports 2.0.5 (et la compatibilité est bien sur 0.6.0).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 exception javax.servlet.ServletException: Error loading object from file : C:\workspace\oge\.\WEB-INF\src\com\arcorp\edition\gestag\ficheStagiaire\SubReportStagiaire.jasper org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) com.SecurityFilter.doFilter(SecurityFilter.java:52) com.TrackingFilter.doFilter(TrackingFilter.java:61) cause mère net.sf.jasperreports.engine.JRException: Error loading object from file : C:\[...]\SubReportStagiaire.jasper net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:133) net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:106) net.sf.jasperreports.engine.JasperManager.loadReport(JasperManager.java:1038) com.ReportBuilder.editSubReport(ReportBuilder.java:95) com.ReportBuilder.buildReport(ReportBuilder.java:76) com.ReportAction.execute(ReportAction.java:91) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) com.SecurityFilter.doFilter(SecurityFilter.java:52) com.TrackingFilter.doFilter(TrackingFilter.java:61)
Voilà, c'est tout. J'ai un peu abrégé le code et modifié quelques trucs par ci par là (pseudo confidentialité oblige... :p) mais j'ai vraiment repéré aucune erreur dans le code, pour moi, logiquement, ça devrait fonctionner, c'est juste qu'il arrive pas à charger les sous-rapport et j'ignore complètement pourquoi, j'ai même utilisé un rapport principal et des sous-rapports déjà existants (et qui fonctionnent) que j'ai ensuite modifiés via iReports pour obtenir ce qu'il me fallait.
Donc si l'un de vous voit un truc qui cloche, qu'il n'hésite pas à me le dire parce que là, j'suis à court d'idées... Je peux aussi donner d'autres informations si nécessaire.
Merci d'avance.
Partager