Java 为什么在尝试从数据适配器检索bean时会出现错误(ClassCastException)?

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: $

我使用JasperSoft Studio创建了一个报告

我在这里引用这篇有用的文章

我想检索订单列表。课程顺序定义如下:

公共类秩序{
私人双价;
私人整数数量;
私人产品;
//接球手和接球手
}
如果要检索价格数量,则会成功生成报告。但是,一旦我检索到产品,就会显示:

详情:

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是为数据提供者设置的
  • 第二个-通过项目的构建路径
是的,它是具有相同类的相同jar文件(物理上)。看起来像是在类路径上有多个jar的问题

在理解了问题的根源之后,我们可以很容易地解决这个问题

我们应该在bean类中只保留一个jar——在JSS构建路径:

这意味着我们应该从数据适配器的属性中删除jar。像这样:

在此之后,最好重新启动JSS

对于此jrxml:


我们正在JSS成功获得报告:



在Java项目中,一切正常(没有任何黑魔法),因为我们在类路径中只有一个jar和bean类。

如果其他人正在寻找解决方案,我有一个稍微不同的设置,因此有一个稍微不同的解决方案(尽管是相同的根问题)

我的设置包括-

  • 我的主项目包含我报告中需要的所有类/子类

  • 一个带有bean工厂的单独项目,用于加载报表的对象

  • 指向#2中工厂方法的数据适配器(无jar文件)

  • 将项目1和2包含在彼此的构建路径中


  • 我能够通过将工厂类/方法从项目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>