I have a need to create a report in DynamicJasper that has multiple “subreports” which contain different columns. The data for the columns is stored in a HashMap on each row Object. I have not found any way in DynamicJasper to specify that a column’s value should come from a particular key on the HashMap.
I have found that if I build a single report, I can extend JRAbstractBeanDataSource and create my own Data Source that knows how to get the data correctly based on how I format the field name. However, when I use addConcatenatedReport to add in multiple reports, the “subreports” use JRBeanCollectionDataSource instead of my custom Data Source.
The only solution I have come up with so far is to have a POJO that has a bunch of properties like “column1value” and “column2value” which I preload and use for the field references in the dynamic columns. I really don’t want to do this…can anyone think of any other options? Anything I am missing?
Sidenote: any ideas why you can’t pass a custom data source type to the addConcatenatedReport function? Technical issues, or it just hasn’t been needed? Seems like this would be a common need for a “dynamic” report.
I was searching for the same thing yesterday and I came across your post (and I saw it was recent). After some search I managed to overcome this problem so I thought it would be nice to share with you my findings.
I suppose that you defined an POJO for your data and then added all these objects to the HashMap (correct me if I am right).
What I did was to create a new Object that extends HashMap implementation. (In fact you dont have to extend this, you can use the HashMap object itself). So now instead of having objects inside HashMap I directly inserted values for the properties. But lets just add some code blocks in order to clear things 🙂
Suppose that you have the following PoJO
Instead of adding these various objects to a List and providing it as datasource you can use a HashMap this way to define your objects:
After defining these objects we can add them in a List and provide it as datasource (
JRBeanCollectionDataSource). So the keys of eachHashMapare considered to be the properties defined in the Columns (the properties of the initial POJO).I dont know if my solution is the best but it worked for me!