Jaspersoft Studio:如何在数据适配器中使用Java Bean的集合

时间:2016-12-01 04:20:39

标签: jasper-reports jaspersoft-studio

文档过时,无论如何都没有帮助。我使用对话框添加类和静态方法,以及保存相关类的.jar文件的路径。

当我点击测试连接时,我收到错误消息,说它无法找到该类....

enter image description here

是的,jar文件就在那条路径上。我是否需要在项目属性中的其他位置进一步处理该路径?

以下是应该描述此过程的文档部分的link

1 个答案:

答案 0 :(得分:4)

我认为你的全名是问题 - 在你的情况下可能缺少包。

样品

以下是 Jaspersoft Studio 6.2.1 JSS )中的工作原理示例。

Java代码

Bean Order:

package ru.alex;

public class Order {

    private double price;
    private int quantity;
    private Product product;

    public double getPrice() {
        return this.price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getQuantity() {
        return this.quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public Product getProduct() {
        return this.product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public Order(double price, int quantity, Product product) {
        this.price = price;
        this.quantity = quantity;
        this.product = product;
    }
}

Bean 产品

package ru.alex;

public class Product {

    private String name;

    public String getName() {
        return this.name;
    }

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

    public Product(String name) {
        this.name = name;
    }
}

使用静态方法获取订单对象 Collection 的工厂:

package ru.alex;

import java.util.*;

public class OrderFactory {

    public static Collection<Order> getOrders() {
        List<Order> orders = new ArrayList<>();
        orders.add(new Order(8.0, 2, new Product("apples")));
        orders.add(new Order(2.5, 10, new Product("oranges")));
        return orders;
    }
}

所有课程都在 ru.alex 包中。

数据适配器设置

JSS JavaBeans 类型数据适配器的设置:

Adapter Settings

此数据适配器是在向导的帮助下创建的:

Type of adapter

我没有将 beans.jar 添加到 JSS 中项目的 Java Build Path 中,并且所有(适配器)都可以工作好。可以通过按 Test 按钮来检查它。

复选框使用字段说明在此游戏中不起任何作用。

我在设置中使用了完整的班级名称:ru.alex.OrderFactory

现在可以在报告中使用此适配器。

创建报告模板

由于适配器准备就绪,我们可以使用它。

数据集和查询Dailog ,我们可以忽略class not found by ....的消息,并在设置类名后手动添加字段。

Dataset and Quqery dialog

报告将是这样的:

<jasperReport ...>
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="JavaBeanCollection - orders"/>
    <field name="price" class="java.lang.Double"/>

如果我们将带有bean的jar添加到IDE构建路径中,如下所示:

The libs path

行为将会改变。在数据集和查询Dailog 中键入类名后,将自动显示字段列表:

Dataset and Query Dailog, auto filling

添加第二个jar后,我们可以解决 ClassCastException 问题。只应将具有相同类的单个 jar 添加到类路径( JSS )中。请查看帖子的底部以查找更多信息。

模板

如果我们只想显示来自 Order 类的字段,我们只能使用 Dataset和Query Dailog 来构建字段列表。

jrxml 用于显示价格&amp;订单数量将是:

<?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="Report with Bean" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="JavaBeanCollection - orders"/>
    <field name="product" class="ru.alex.Product">
        <fieldDescription><![CDATA[product]]></fieldDescription>
    </field>
    <field name="quantity" class="java.lang.Integer">
        <fieldDescription><![CDATA[quantity]]></fieldDescription>
    </field>
    <field name="price" class="java.lang.Double">
        <fieldDescription><![CDATA[price]]></fieldDescription>
    </field>
    <detail>
        <band height="30" splitType="Stretch">
            <textField>
                <reportElement x="10" y="0" width="100" height="30"/>
                <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="110" y="0" width="100" height="30"/>
                <textFieldExpression><![CDATA[$F{price}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

如果我们想要显示,例如产品名称,我们需要添加新字段:

<field name="productName" class="java.lang.String">
    <fieldDescription><![CDATA[product.name]]></fieldDescription>
</field>

在这种情况下,模板为:

<?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="Report with Bean" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="JavaBeanCollection - orders"/>
    <field name="product" class="ru.alex.Product">
        <fieldDescription><![CDATA[product]]></fieldDescription>
    </field>
    <field name="quantity" class="java.lang.Integer">
        <fieldDescription><![CDATA[quantity]]></fieldDescription>
    </field>
    <field name="price" class="java.lang.Double">
        <fieldDescription><![CDATA[price]]></fieldDescription>
    </field>
    <field name="productName" class="java.lang.String">
        <fieldDescription><![CDATA[product.name]]></fieldDescription>
    </field>
    <detail>
        <band height="30" splitType="Stretch">
            <textField>
                <reportElement x="10" y="0" width="100" height="30"/>
                <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="110" y="0" width="100" height="30"/>
                <textFieldExpression><![CDATA[$F{price}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="210" y="0" width="100" height="30"/>
                <textFieldExpression><![CDATA[$F{productName}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

小心!我们可能会遇到Why do I get error when trying to retrive bean from my data adapter?帖子中描述的问题。我们应该只使用 Bean 类保留一个 jar 。例如, Java Build Path 中的 jar

完整的解释是参考帖子。