Динамические отчеты: ошибка при получении значения поля из бина

Я использую динамическую библиотеку яшмы для создания динамических столбцов для моего отчета.
Это мой код:

FastReportBuilder drb = new FastReportBuilder();
          DynamicReport dr = drb.addColumn("State", "state", String.class.getName(),30)
                  .addColumn("Branch", "branch", String.class.getName(),30) // title, property to show, class of the property, width
                  .addColumn("Product Line", "productLine", String.class.getName(),50)
                  .addColumn("Item", "item", String.class.getName(),50)
                  .addColumn("Item Code", "id", Long.class.getName(),20)
                  .addColumn("Quantity", "quantity", Long.class.getName(),30)
                  .addColumn("Amount", "amount", Float.class.getName(),30)
                  .addGroups(2)   // Group by the first two columns
                  .setTitle("November 2006 sales report")
                  .setSubtitle("This report was generateed at" + new Date())
                  .setUseFullPageWidth(true) //make colums to fill the page width
                  .build();      

          JRDataSource ds = new JRBeanCollectionDataSource(TestRepositoryProducts.getDummyCollection());  
          JasperPrint jp = DynamicJasperHelper.generateJasperPrint(dr, new ClassicLayoutManager(), ds);
          JasperViewer.viewReport(jp);

И это мой класс TestRepositoryProducts:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Vector;

public class TestRepositoryProducts {

    public static Collection<Object> getDummyCollection() {
        Collection<Object> v = new ArrayList<Object>();
        v.add("qsdqsd");
        v.add("qsdqdqs");
        v.add("qsdqdqs");
        v.add("qsdqdqs");
        v.add(32165);
        v.add(65456);
        v.add(1.5);
        return v;
    }

}

И это ошибка:

1 ответ

Решение

JRBeanCollectionDataSource требуется набор Beans, каждый из которых представляет одну строку, а не набор объектов, каждый из которых представляет столбец (как вы, кажется, думаете).

Классу Бина потребуются методы получения / установки для каждого из определенных вами свойств, например getState(), getBranch() и так далее.

Например:

public class MyBean {
    private String state;
    // other properties

    public MyBean() {}

    public String getState() { 
        return state;
    }

    public void setState(String s) {
        state = s;
    }

    // other getters and setters
}

И ваш тестовый класс создаст коллекцию этих классов MyBean:

public class TestRepositoryProducts {
    public static Collection<MyBean> getDummyCollection() {
        Collection<MyBean> v = new ArrayList<MyBean>();
        MyBean b1 = new MyBean();
        b1.setState("s1");
        b1.setBranch("b1");
        // set other properties of b1
        v.add(b1);

        // more beans created and added to v
        return v;
    }
Другие вопросы по тегам