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

查看:101
本文介绍了使用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.

我有一个豆子:

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).

这篇关于使用JasperReports API从bean异常检索字段值时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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