Jaspersoft Studio:如何在数据适配器中使用 Java Beans 集合
Jaspersoft Studio: How to use Collection of Java Beans in data adapter
文档已过时且无用。我使用对话框添加 class 和静态方法,以及包含相关 classes.
的 .jar 文件的路径
当我点击测试连接时,我收到一条错误消息,提示找不到 class ....
是的,jar 文件位于该路径。我是否需要在项目属性或其他地方的其他地方进一步了解该路径?
这是应该描述此过程的文档部分的 link
我认为你的问题全名是 class - 可能是你的包丢失了。
样本
这是它在 Jaspersoft Studio 6.2.1 中的工作方式示例 (JSS)。
Java代码
Bean 订单:
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 of Order 对象的工厂:
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;
}
}
所有 class 都在 ru.alex 包中。
数据适配器设置
Collection of JavaBeans类型数据适配器在JSS中的设置:
此数据适配器是在向导的帮助下创建的:
我没有将 beans.jar 添加到项目的 Java Build Path in JSS 一切(适配器)工作正常。可以通过按测试按钮来检查。
复选框使用字段描述在此游戏中没有任何作用。
我在设置中使用了完整的 class 名称:ru.alex.OrderFactory
。
现在可以在报告中使用此适配器了。
正在创建报告模板
由于适配器准备就绪,我们可以使用它了。
在 Dataset 和 Query Dailog 我们可以忽略消息 class not found by ....
并在设置 class 名称后手动添加字段。
报告将是这样的:
<jasperReport ...>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="JavaBeanCollection - orders"/>
<field name="price" class="java.lang.Double"/>
如果我们将包含 bean 的 jar 添加到 IDE 构建路径,如下所示:
行为将会改变。在 Dataset 和 Query Dailog:
输入 class 名称后,字段列表将自动出现
添加第二个 jar 后我们可以得到 ClassCastException 麻烦。只应将具有相同 classes 的单个 jar 添加到 classpath (JSS)。请查看底部的 post 以查找更多信息。
模板
如果我们只想显示来自 Order class 的字段,我们可以只使用 Dataset 和 Query Dailog 来构造字段列表。
用于显示订单价格和数量的 jrxml 将是:
<?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>
注意! 我们可能会遇到 post 中描述的问题。我们应该只保留一个 jar 和 Bean classes。例如,jar 在 Java Build Path.
完整描述见参考资料 post。
文档已过时且无用。我使用对话框添加 class 和静态方法,以及包含相关 classes.
的 .jar 文件的路径当我点击测试连接时,我收到一条错误消息,提示找不到 class ....
是的,jar 文件位于该路径。我是否需要在项目属性或其他地方的其他地方进一步了解该路径?
这是应该描述此过程的文档部分的 link
我认为你的问题全名是 class - 可能是你的包丢失了。
样本
这是它在 Jaspersoft Studio 6.2.1 中的工作方式示例 (JSS)。
Java代码
Bean 订单:
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 of Order 对象的工厂:
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;
}
}
所有 class 都在 ru.alex 包中。
数据适配器设置
Collection of JavaBeans类型数据适配器在JSS中的设置:
此数据适配器是在向导的帮助下创建的:
我没有将 beans.jar 添加到项目的 Java Build Path in JSS 一切(适配器)工作正常。可以通过按测试按钮来检查。
复选框使用字段描述在此游戏中没有任何作用。
我在设置中使用了完整的 class 名称:ru.alex.OrderFactory
。
现在可以在报告中使用此适配器了。
正在创建报告模板
由于适配器准备就绪,我们可以使用它了。
在 Dataset 和 Query Dailog 我们可以忽略消息 class not found by ....
并在设置 class 名称后手动添加字段。
报告将是这样的:
<jasperReport ...>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="JavaBeanCollection - orders"/>
<field name="price" class="java.lang.Double"/>
如果我们将包含 bean 的 jar 添加到 IDE 构建路径,如下所示:
行为将会改变。在 Dataset 和 Query Dailog:
输入 class 名称后,字段列表将自动出现添加第二个 jar 后我们可以得到 ClassCastException 麻烦。只应将具有相同 classes 的单个 jar 添加到 classpath (JSS)。请查看底部的 post 以查找更多信息。
模板
如果我们只想显示来自 Order class 的字段,我们可以只使用 Dataset 和 Query Dailog 来构造字段列表。
用于显示订单价格和数量的 jrxml 将是:
<?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>
注意! 我们可能会遇到
完整描述见参考资料 post。