2014-05-01 4 views
1

Я пытаюсь написать часть программного обеспечения для составления отчета полезных нотамов для моего устройства.Jasper Reports - JRException: ошибка получения значения поля из bean

Я проверил Unable to retrieve value from a JavaBean while generating reports using JasperReports API нить.

У меня такая же проблема, но либо я слепой (или тупой, либо комбинация из двух), либо в моем коде есть что-то плохое.

Вот мой боб:

package report; 

public class ReportBean { 

    private String notamLocator; 
    private String notamSeries; 
    private String fieldA; 
    private int notamClass; 

    public void setNotamLocator(String NotamLocator) { 
     this.notamLocator = NotamLocator; 
    } 

    public void setNotamSeries(String NotamSeries) { 
     this.notamSeries = NotamSeries; 
    } 

    public void setFieldA(String FieldA) { 
     this.fieldA = FieldA; 
    } 

    public void setNotamClass(int NotamClass) { 
     this.notamClass = NotamClass; 
    } 

    public String getNotamLocator() { 
     return this.notamLocator; 
    } 

    public String getNotamSeries() { 
     return this.notamSeries; 
    } 

    public String getFieldA() { 
     return this.fieldA; 
    } 

    public int getNotamClass() { 
     return this.notamClass; 
    } 

    public String toString() { 
     StringBuffer buf = new StringBuffer(); 
     buf.append(getNotamLocator()); 
     buf.append(", "); 
     buf.append(getNotamClass()); 
     buf.append(", "); 
     buf.append(getNotamSeries()); 
     buf.append(", "); 
     buf.append(getFieldA()); 
     return buf.toString(); 
    } 
} 

Это мой служебный класс, чтобы создать коллекцию этих бобов

package report; 

import java.sql.*; 
import java.util.*; 
import database.*; 

public class DataBeanMaker { 

    public ArrayList<ReportBean> getDataBeanList() throws Exception { 

     ArrayList<ReportBean> list = new ArrayList<ReportBean>(); 
     AccessDatabase ad = new AccessDatabase(); 
     Connection conn = ad.getConnection(); 

     String query = "SELECT NotamLocator, NotamSeries, NotamClass, FieldA FROM TEMP_NOTAMS"; 
     Statement st = conn.createStatement(); 
     ResultSet rs = st.executeQuery(query); 

     while (rs.next()) { 
      String NotamLocator = rs.getString("NotamLocator"); 
      int NotamClass = rs.getInt("NotamClass"); 
      String NotamSeries = rs.getString("NotamSeries"); 
      String FieldA = rs.getString("FieldA"); 
      ReportBean bean = produce(NotamLocator, NotamSeries, FieldA, NotamClass); 
      System.out.println(bean); 
      list.add(bean); 
     } 
     return list; 
    } 

    private ReportBean produce(String NotamLocator, String NotamSeries, String FieldA, int NotamClass) { 
     ReportBean reportBean = new ReportBean(); 
     reportBean.setNotamSeries(NotamSeries); 
     reportBean.setNotamLocator(NotamLocator); 
     reportBean.setFieldA(FieldA); 
     reportBean.setNotamClass(NotamClass); 
     return reportBean; 
    } 
} 

и, наконец, мой класс, который на самом деле пытается создать отчет

package report; 

import database.*; 
import enav.alg.Constants; 

import java.sql.*; 
import java.util.*; 
import java.io.*; 

import net.sf.jasperreports.engine.*; 
import net.sf.jasperreports.engine.data.*; 
import net.sf.jasperreports.engine.design.JasperDesign; 
import net.sf.jasperreports.engine.xml.JRXmlLoader; 

public class report { 

    public static void main(String[] args) throws Exception { 

     Constants c = new Constants(new String[]{"E:/Documents/Netbeans Projects/IText/"}); 
     AccessDatabase ad = new AccessDatabase(); 
     File reportModel = new File(Constants.jasperreports, "test_report.jrxml"); 
     InputStream is = new FileInputStream(reportModel); 

     DataBeanMaker dbm = new DataBeanMaker(); 
     ArrayList<ReportBean> dataBeanList = dbm.getDataBeanList(); 

     JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataBeanList, false); 
     JasperDesign jasperDesign = JRXmlLoader.load(is); 
     JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
     JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, beanColDataSource); 

     JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.jasperreports + "/pdfReport.pdf"); 
    } 
} 

Я получаю это исключение:

Exception in thread "main" net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : NotamLocator 
    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:109) 
    at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1358) 
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1259) 
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1614) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:150) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:892) 
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:114) 
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668) 
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984) 
    at report.report.main(report.java:41) 
Caused by: java.lang.NoSuchMethodException: Unknown property 'NotamLocator' on class 'class report.ReportBean' 
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1257) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:808) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:884) 
    at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:464) 
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111) 
    ... 13 more 
Java Result: 1 

Я считаю, что эти поля имеют соответствующие имена, запросы не являются пустыми (я посылаю на консоль, что я добавляю в коллекцию, и это то, что я ожидал от успешного запроса & не пустой результат множества). Любые подсказки?

+0

Вы должны отправить файл * jrxml * –

ответ

0

Забыл прикрепить что

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="scriptlet" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="30" rightMargin="30" topMargin="30" bottomMargin="30" whenResourceMissingType="Empty" uuid="d9bf623c-068d-48aa-96e5-812e9c4428a5"> 
<property name="com.jasperassistant.designer.Grid" value="false"/> 
<property name="com.jasperassistant.designer.SnapToGrid" value="false"/> 
<property name="com.jasperassistant.designer.GridWidth" value="12"/> 
<property name="com.jasperassistant.designer.GridHeight" value="12"/> 
<queryString> 
    <![CDATA[]]> 
</queryString> 
<field name="NotamLocator" class="java.lang.String"> 
    <fieldDescription><![CDATA[NotamLocator]]></fieldDescription> 
</field> 
<field name="NotamClass" class="java.lang.Integer"> 
    <fieldDescription><![CDATA[NotamClass]]></fieldDescription> 
</field> 
<field name="NotamSeries" class="java.lang.String"> 
    <fieldDescription><![CDATA[NotamSeries]]></fieldDescription> 
</field> 
<field name="FieldA" class="java.lang.String"> 
    <fieldDescription><![CDATA[FieldA]]></fieldDescription> 
</field> 
<group name="dummy"> 
    <groupExpression><![CDATA["dummy"]]></groupExpression> 
    <groupHeader> 
     <band height="23"> 
      <staticText> 
       <reportElement x="0" y="5" width="150" height="15" uuid="47b49689-5ef6-4374-a053-638e9c38621b"/> 
       <textElement textAlignment="Center" verticalAlignment="Middle"> 
        <font isBold="true"/> 
       </textElement> 
       <text><![CDATA[NotamLocator]]></text> 
      </staticText> 
      <staticText> 
       <reportElement x="150" y="5" width="128" height="15" uuid="9b6384cf-dd3c-4445-9b41-8f83fe87cde2"/> 
       <textElement textAlignment="Center" verticalAlignment="Middle"/> 
       <text><![CDATA[NotamClass]]></text> 
      </staticText> 
      <staticText> 
       <reportElement x="278" y="5" width="121" height="15" uuid="a266b6fb-f95e-4056-ab8e-bb29fc40682a"/> 
       <textElement textAlignment="Center" verticalAlignment="Middle"> 
        <font isBold="true"/> 
       </textElement> 
       <text><![CDATA[NotamSeries]]></text> 
      </staticText> 
      <staticText> 
       <reportElement x="399" y="5" width="136" height="15" uuid="33f07d94-8506-499d-b4c6-3cc16a33fccc"/> 
       <textElement textAlignment="Center" verticalAlignment="Middle"> 
        <font isBold="true"/> 
       </textElement> 
       <text><![CDATA[FieldA]]></text> 
      </staticText> 
     </band> 
    </groupHeader> 
</group> 
<detail> 
    <band height="16"> 
     <textField> 
      <reportElement x="0" y="0" width="150" height="15" uuid="7cd33c7d-66c7-44a6-b667-a3d0e1087aa7"/> 
      <textElement textAlignment="Center" verticalAlignment="Middle"/> 
      <textFieldExpression><![CDATA[$F{NotamLocator}]]></textFieldExpression> 
     </textField> 
     <textField> 
      <reportElement x="150" y="0" width="128" height="15" uuid="789dd66e-7f67-4226-9d78-0e204dec0381"/> 
      <textElement textAlignment="Center" verticalAlignment="Middle"/> 
      <textFieldExpression><![CDATA[$F{NotamClass}]]></textFieldExpression> 
     </textField> 
     <textField> 
      <reportElement x="278" y="1" width="121" height="15" uuid="50e3e465-e798-4f45-aa87-24aa63a85248"/> 
      <textElement textAlignment="Center" verticalAlignment="Middle"> 
       <font size="9"/> 
      </textElement> 
      <textFieldExpression><![CDATA[$F{NotamSeries}]]></textFieldExpression> 
     </textField> 
     <textField> 
      <reportElement x="399" y="1" width="136" height="15" uuid="2113c22b-36c2-4c9d-acf4-17dd9b93b019"/> 
      <textElement textAlignment="Center" verticalAlignment="Middle"/> 
      <textFieldExpression><![CDATA[$F{FieldA}]]></textFieldExpression> 
     </textField> 
    </band> 
</detail> 
</jasperReport> 

я имел возможность читать немного больше, и выяснил, что самый простой способ моей цели была обходя на основе населения коллекции доклада и приклеить к ResultSet. Так что теперь он работает. Я изменил свой класс DataBeanMaker

public ResultSet getDefaultBeanList() throws Exception { 
    AccessDatabase ad = new AccessDatabase(); 
    Connection conn = ad.getConnection(); 

    String query = "SELECT NotamLocator, NotamSeries, NotamClass, FieldA FROM TEMP_NOTAMS"; 
    Statement st = conn.createStatement(); 
    ResultSet rs = st.executeQuery(query); 

    return rs; 
} 

и все работает так хорошо. Конечно, просмотр отчета нуждается в подтяжке лица, но это совершенно другая история. Что меня сейчас беспокоит, я не понимаю, что было не так в моем прежнем подходе (кроме того, я явно изобретал колесо). Спасибо. andrea

0

использовать одинаковые имена полей с чувствительностью к регистру и попробовать. Я думаю, это может помочь вам. использование

<field name="notamLocator" class="java.lang.String"> 
</field> 
Смежные вопросы