Java 为什么在尝试从数据适配器检索bean时会出现错误(ClassCastException)?
我使用JasperSoft Studio创建了一个报告 我在这里引用这篇有用的文章 我想检索订单列表。课程顺序定义如下:Java 为什么在尝试从数据适配器检索bean时会出现错误(ClassCastException)?,java,jasper-reports,classcastexception,jaspersoft-studio,Java,Jasper Reports,Classcastexception,Jaspersoft Studio,我使用JasperSoft Studio创建了一个报告 我在这里引用这篇有用的文章 我想检索订单列表。课程顺序定义如下: 公共类秩序{ 私人双价; 私人整数数量; 私人产品; //接球手和接球手 } 如果要检索价格或数量,则会成功生成报告。但是,一旦我检索到产品,就会显示: 详情: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: $
公共类秩序{
私人双价;
私人整数数量;
私人产品;
//接球手和接球手
}
如果要检索价格或数量,则会成功生成报告。但是,一旦我检索到产品,就会显示:
详情:
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: $F{product}.getName()
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:530)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$20(ReportControler.java:505)
...
Caused by: java.lang.ClassCastException: ru.alex.Product cannot be cast to ru.alex.Product
at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:277)
... 14 more
文件sample.jrxml为:
JRBeanCollection如下所示:
公共类MyImplementation实现JRDataSource{
// (...)
公共静态集合getOrders(){
列表顺序=新的ArrayList();
订单。添加(新订单(1,“aa”、新大十进制(“1111.11”)、2、新产品(“苹果”));
订单。添加(新订单(2,“bb”、新大十进制(“2222.22”)、10、新产品(“橙子”));
退货订单;
}
// (...)
}
您能告诉我异常的原因吗?它看起来像是Jaspersoft Studio(JSS)的一个bug
我认为获取ClassCastException的原因(看看stacktrace的这一部分:,原因是:java.lang.ClassCastException:ru.alex.Product不能转换为ru.alex.Product
)是使用了两个jar文件:
- 第一个jar是为数据提供者设置的李>
- 第二个-通过项目的构建路径
我们正在JSS成功获得报告:
在Java项目中,一切正常(没有任何黑魔法),因为我们在类路径中只有一个jar和bean类。如果其他人正在寻找解决方案,我有一个稍微不同的设置,因此有一个稍微不同的解决方案(尽管是相同的根问题) 我的设置包括-
我能够通过将工厂类/方法从项目2移动到项目1并删除项目2来修复它。我使用的是eclipse插件,但在我重新启动eclipse之前,该插件不起作用。
计算源文本的表达式时出错:$F{product}.getName()
-是否有名称
字段的公共getter?看起来您正在使用my:)您应该发布小jrxml来重现问题Hello Sir@AlexK,非常感谢您的优秀示例,这对我帮助很大。我按照你们介绍的做了,只是在检索产品时发现了问题。是的,我有名称字段的公共getter。我对我的问题做了修改,你能看一下吗:我共享了sample.jrxml文件?非常感谢,先生。考虑使用BigDigPiple而不是加倍。您好,先生@DaveJarvis,非常感谢您的回复,但我的问题不在于价格
,一旦我谈到价格
,报告就会成功生成。只有当我想用String
类型检索name
的Product
时才发现问题。您好,先生@AlexK,非常感谢您的帮助和好意。你让我很开心。我很抱歉浪费你的时间。实际上,我找到了另一种检索产品名称的解决方案(在类订单上,我使用字符串名称而不是产品名称,然后在类OrderFactory上进行了相同的更改,因此mein给出了所需的结果,但它没有得到优化)。因此,非常感谢先生。你真的是StackOverFlow上最棒的。问候语。
<?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>
<textField>
<reportElement x="210" y="0" width="100" height="30"/>
<textFieldExpression><![CDATA[$F{product}.getName()]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>