Gettting使用JasperReports API从bean异常中检索字段值时出错 [英] Gettting Error retrieving field value from bean Exception with JasperReports API

查看:95
本文介绍了Gettting使用JasperReports API从bean异常中检索字段值时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获取由 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆