我是Jasper Report的新手,需要生成一个反映复杂Java bean中所有字段的报告。 Java bean包含简单String
字段和其他Java bean数组的组合,如:
class Abean {
String a1, a2, a3, a4, a5, a6;
Bbean[] bbeanArray;
Xbean[] xbeans;
}
class Bbean {
String b1, b2, b3;
Cbean[] cbean;
}
class Cbean {
String c1, c2, c3, c4, c5;
}
class Xbean {
String x1, x2;
}
从Jasper文档和API中,似乎最合适的解决方案是使用JRAbstractBeanDataSource
和JRAbstractBeanDataSourceProvider
,而不是其他类型的集合/数组DataSource,但是从最近的我可以找到的示例 - 在http://community.jaspersoft.com/wiki/how-create-and-use-jrdatasource-adapter和http://community.jaspersoft.com/wiki/how-create-and-use-jrdatasourceprovider-adapter上展示 - 我仍然不了解如何使用JRAbstractBeanDataSource
和JRAbstractBeanDataSourceProvider
类。
第一个让我觉得它实际上很简单明了的例子就是他们的JavaDoc示例http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDataSourceProvider.html - 我已经改变了它,因为我认为它应该是我的{{ 1}} class:
Abean
但是当我尝试时,我收到了这个错误:
public class Abean extends JRAbstractBeanDataSourceProvider {
String a1, a2, a3, a4, a5, a6;
Bbean[] bbeanArray;
Xbean[] xbeans;
public Abean () {
super(Abean.class);
}
public JRDataSource create(JasperReport report) throws JRException {
ArrayList list = new ArrayList();
list.add(this);
return new JRBeanCollectionDataSource(list);
}
public void dispose(JRDataSource dataSource) throws JRException {
// nothing to dispose
}
}
这对我来说没有意义,因为java.lang.ClassCastException: my.test.package.Abean cannot be cast to net.sf.jasperreports.engine.JRDataSourceProvider
at net.sf.jasperreports.data.provider.DataSourceProviderDataAdapterService.getProvider(DataSourceProviderDataAdapterService.java:88)
at net.sf.jasperreports.data.provider.DataSourceProviderDataAdapterService.contributeParameters(DataSourceProviderDataAdapterService.java:110)
at net.sf.jasperreports.data.AbstractDataAdapterService.test(AbstractDataAdapterService.java:128)
at com.jaspersoft.studio.data.wizard.AbstractDataAdapterWizard$3.run(AbstractDataAdapterWizard.java:157)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:122)
扩展了Abean
类的实现 - 所以为什么它抱怨它不能被投射到它?
然后我想我应该让JRDataSourceProvider
扩展Abean
类。这些示例还鼓励使用扩展JRAbstractBeanDataSource
的内部类,以帮助识别bean的字段。看起来比我想象的要复杂得多。
我希望Jasper有一个明确的方法来识别像我上面的JRBaseField
示例那样用来填充报表的bean对象。据我所知,许多报告都希望从数据库查询中返回一个对象的集合/列表,但在我的情况下,报告只是由一个Java bean提供。
上面列出的示例(http://community.jaspersoft.com/wiki/how-create-and-use-jrdatasource-adapter和http://community.jaspersoft.com/wiki/how-create-and-use-jrdatasourceprovider-adapter)似乎很难识别应该可用于填充报表的每个bean属性。我让我研究核心Java内省和反射API,以便能够从bean中自动提取所有字段。这真的有必要吗?我错过了Jasper的API吗?
任何指向使用单个Java bean填充Jasper报告的不同示例的指针都将非常受欢迎。