如何用嵌套的Java bean提供Jasper报告?

时间:2015-05-22 03:41:41

标签: java jasper-reports

我是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中,似乎最合适的解决方案是使用JRAbstractBeanDataSourceJRAbstractBeanDataSourceProvider,而不是其他类型的集合/数组DataSource,但是从最近的我可以找到的示例 - 在http://community.jaspersoft.com/wiki/how-create-and-use-jrdatasource-adapterhttp://community.jaspersoft.com/wiki/how-create-and-use-jrdatasourceprovider-adapter上展示 - 我仍然不了解如何使用JRAbstractBeanDataSourceJRAbstractBeanDataSourceProvider类。

第一个让我觉得它实际上很简单明了的例子就是他们的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-adapterhttp://community.jaspersoft.com/wiki/how-create-and-use-jrdatasourceprovider-adapter)似乎很难识别应该可用于填充报表的每个bean属性。我让我研究核心Java内省和反射API,以便能够从bean中自动提取所有字段。这真的有必要吗?我错过了Jasper的API吗?

任何指向使用单个Java bean填充Jasper报告的不同示例的指针都将非常受欢迎。

0 个答案:

没有答案