3

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.

Steve
  • 1,605
  • 1
  • 18
  • 29

1 Answers1

0

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

public class MyPOJO{

  private String name;
  private String value;
  //getters, setters etc..
 }

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:

Map<String,String> myObject1=new HashMap<String,String>();
myObject1.put("name","Name1");
myObject1.put("value","Value1");

Map<String,String> myObject2=new HashMap<String,String>();
myObject2.put("name","Name2");
myObject2.put("value","Value2");

After defining these objects we can add them in a List and provide it as datasource (JRBeanCollectionDataSource). So the keys of each HashMap are 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!

P̲̳x͓L̳
  • 3,615
  • 3
  • 29
  • 37