参见英文答案 Unable to retrieve value from a JavaBean while generating reports using JasperReports API2个 我正在尝试获取JasperReports生成的示例报告,但它抛出了一些我无法理解的异常. 我有一个豆子: cl
我正在尝试获取JasperReports生成的示例报告,但它抛出了一些我无法理解的异常.
我有一个豆子:
class DataBean { public String country; public String name; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
产生上述bean列表的类:
class DataBeanList { public ArrayList<DataBean> getDataBeanList() { ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>(); dataBeanList.add(produce("Manisha", "India")); dataBeanList.add(produce("Dennis Ritchie", "USA")); dataBeanList.add(produce("V.Anand", "India")); dataBeanList.add(produce("Shrinath", "California")); return dataBeanList; } private DataBean produce(String name, String country) { DataBean dataBean = new DataBean(); dataBean.setName(name); dataBean.setCountry(country); return dataBean; } }
这就是我在做的事情:
public static void main(String[] args) throws Exception { String sourceFileName = "/home/oodles/Samples/jasper_report_template.jasper"; DataBeanList DataBeanList = new DataBeanList(); ArrayList<DataBean> dataList = DataBeanList.getDataBeanList(); System.out.println("<<<" + dataList.get(0).getCountry()); JasperReportBuilder report = DynamicReports.report(); JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataList, false); report.setDataSource(beanColDataSource); Map parameters = new HashMap(); try { JasperFillManager.fillReportToFile(sourceFileName, parameters, beanColDataSource); } catch (JRException e) { e.printStackTrace(); } }
例外情况如下:
net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : country at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123) at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96) at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100) at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1331) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1232) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1208) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1554) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:149) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88) at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653) at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:542) at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:494) at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:874) at com.general.ReportsMain.main(ReportsMain.java:80) Caused by: java.lang.NoSuchMethodException: Property 'country' has no getter method in class 'class com.general.DataBean' at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1318) at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:762) at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:837) at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426) at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111) ... 15 more
如果您需要查看.jasper文件源:
我只附加字段,只显示有意义的代码:
<field name="country" class="java.lang.String"> <fieldDescription><![CDATA[country]]></fieldDescription> </field> <field name="name" class="java.lang.String"> <fieldDescription><![CDATA[name]]></fieldDescription> </field>最后,我想出了你需要做些什么来避免任何异常:
您可以在其他包中访问您的数据源以从中提取数据,如果您的数据源的bean不是公共的,那么就无法访问该类.
所以你需要公开你的类(bean类).