本文介绍了使用JasperReports API生成报告时无法从JavaBean检索值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从列表中生成一个简单的 JR 报告。

I am trying to generate a simple JR report from a list.

我一直在错误从中检索字段值bean:name

此错误是由于错误的getter方法名称,因为jasper使用反射从bean中获取字段。但是,即使在更正了getter方法名称之后。我一直得到这个例外。还有其他问题吗?

This error comes due to wrong getter method-name since jasper uses reflection to take the fields from a bean. However even after correcting the getter method-name. I keep getting this exception. Is there any other problem?

我的 jrxml 文件是

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jasperReport PUBLIC  "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="simpleReport">
  <field name="name" class="java.lang.String"/>
  <field name="count" class="java.lang.String"/>
  <title>
        <band height="50">
            <staticText>
          <reportElement x="0" y="0" width="180" height="15"/>
            <textElement/>
          <text><![CDATA[Report]]></text>
        </staticText>
        </band>
    </title>
  <pageHeader>
      <band/>
  </pageHeader>
  <columnHeader>
        <band height="20">
        <staticText>
          <reportElement x="180" y="0" width="180" height="20"/>
        <textElement>
            <font isUnderline="true"/>
        </textElement>
        <text><![CDATA[Event Name]]></text>
      </staticText>
      <staticText>
        <reportElement x="360" y="0" width="180" height="20"/>
        <textElement>
          <font isUnderline="true"/>
        </textElement>
        <text><![CDATA[Count]]></text>
      </staticText>
    </band>
  </columnHeader>
  <detail>
    <band height="20">
      <textField>
        <reportElement x="180" y="0" width="180" height="15"/>
        <textElement/>
        <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
      </textField>
      <textField>
        <reportElement x="360" y="0" width="180" height="15"/>
        <textElement/>
        <textFieldExpression><![CDATA[$F{count}]]></textFieldExpression>
      </textField>
    </band>
  </detail>
  <columnFooter>
    <band/>
  </columnFooter>
  <pageFooter>
    <band height="15">
      <staticText>
        <reportElement x="0" y="0" width="40" height="15"/>
        <textElement/>
        <text><![CDATA[Page:]]></text>
      </staticText>
      <textField>
        <reportElement x="40" y="0" width="100" height="15"/>
        <textElement/>
        <textFieldExpression class="java.lang.Integer"><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
      </textField>
    </band>
  </pageFooter>
  <summary>
    <band/>
  </summary>
</jasperReport>

Bean类是

class EventBean {
    private String name;
    private String count;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }
}

class EventNameList {
    public ArrayList<EventBean> getDataBeanList() {
        ArrayList<EventBean> list = new ArrayList<EventBean>();

        list.add(generate("Flow", "100"));
        list.add(generate("Non flow", "300"));
        list.add(generate("Allow", "600"));
        list.add(generate("Deny", "50"));

        return list;
    }

    private EventBean generate(String name, String country) {
        EventBean bean = new EventBean();
        bean.setName(name);
        bean.setCount(country);

        return bean;
    }
}

我在这里生成报告

JasperCompileManager.compileReportToFile(inpuutjrxml, outputjasper);

EventNameList list = new EventNameList();
JRBeanCollectionDataSource beanList = new JRBeanCollectionDataSource(list.getDataBeanList());

JasperPrint jasperPrint = JasperFillManager.fillReport(outputjasper, new HashMap(), beanList);

JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream(pefoutput));

我们是否需要对bean类进行更多修改?

Do we need to make any more modification to bean class?

推荐答案

解决方案非常简单 - 您应该将 JavaBean 类的访问修饰符更改为 public

The solution is very simple - you should change the access modifier of JavaBean class to public.

喜欢这样:

public class EventBean {
    private String name;
    private String count;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCount() {
        return count;
    }

    public void setCount(String count) {
        this.count = count;
    }
}

不要忘记您使用自己的包裹。

Don't forget that you are using your own package.

您可以找到有关 JavaBean数据源的更多信息

这篇关于使用JasperReports API生成报告时无法从JavaBean检索值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 08:03