2013-12-11 2 views
6

Я пытаюсь получить образец отчета, созданный JasperReports, но он бросает некоторое исключение, которое я не могу понять.Gettting Ошибка получения значения поля из bean-компонента Исключение с API-интерфейсом JasperReports

У меня есть фасоль:

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; 
    } 
} 

Класс, который приводит список выше фасоли:

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 источник файла:
я прилагаю только поля, чтобы показать только значащий код здесь:

<field name="country" class="java.lang.String"> 
    <fieldDescription><![CDATA[country]]></fieldDescription> 
</field> 
<field name="name" class="java.lang.String"> 
    <fieldDescription><![CDATA[name]]></fieldDescription> 
</field> 
+0

Возможный дубликат: [Невозможно получить значение из JavaBean при генерации отчетов с использованием JasperReports API] (http://stackoverflow.com/q/18119754/876298) –

+0

@AlexK благодарит приятеля за то, что он указал мне на правильное решение –

+0

Вы приветствую :) –

ответ

11

Наконец я понял, что вам нужно сделать, чтобы избежать каких-либо исключений:

Ваш источник данных доступен в других пакетах для извлечения данных из них, и если компонент вашего источника данных не является общедоступным, доступ к классу невозможен.
Итак, вам нужно сделать свой класс общедоступным (класс бобов).

+1

он не работает. –

+0

, тогда должна быть какая-то другая проблема, и это не значит, что этот ответ не работает. –