使用JasperReports API生成报告时无法从JavaBean检索值

时间:2013-08-08 06:58:32

标签: java jasper-reports

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

我一直在从bean中检索字段值时出错:名称

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

我的 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类进行更多修改?

2 个答案:

答案 0 :(得分:5)

解决方案非常简单 - 您应该将 JavaBean 类的访问修饰符更改为 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;
    }
}

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


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

答案 1 :(得分:0)

Bean属性应以小写字母

开头

示例:

public class DataBean {
     private String name;
     private String dateStart;
     private String DateEnd; //  ->dateEnd
     private String prixTotale;
     private String prixPayer;