Gettting使用JasperReports API从bean异常中检索字段值时出错 [英] Gettting Error retrieving field value from bean Exception with JasperReports API
问题描述
我正在尝试获取由 JasperReports 生成的示例报告,但它正在抛出一些我无法理解的异常。
I am trying to get a sample report generated by JasperReports but it is throwing some exception that i can not understand.
我有一个bean:
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列表的类:
A class that results list of above 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文件来源:
我只附加字段以在此处仅显示有意义的代码:
In case you need to see .jasper file source:
i am attaching only fields to show only meaningful code here:
<field name="country" class="java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name="name" class="java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
推荐答案
最后我想出了你需要做些什么来避免任何异常:
Finally i figured out what you need to do to avoid any exception:
您的数据源在其他包中被访问以从中提取数据,如果您的数据源的bean不是公共的,则无法访问类。
所以你需要公开你的类(bean类)。
Your datasource is accessed in other packages to extract data from them and if the bean of your datasource is not public then it's not possible to access the class.
SO you need to make your class public (the bean class).
这篇关于Gettting使用JasperReports API从bean异常中检索字段值时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!