You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jasper报表加载图片报错:无法将ByteArrayInputStream转为String

解决Jasper报表加载图片时的类型转换错误

问题说明

在Jasper报表中通过表达式加载图片时,出现类型转换异常,提示无法将ByteArrayInputStream转为String。

错误日志

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Cannot cast from ByteArrayInputStream to String
                value = (java.lang.String)(new ByteArrayInputStream((byte[]) ((java.lang.Object)parameter_logobrasao.getValue()))); //$JR_EXPR_ID=25$
                        <-------------------------------------------------------------------------------------------------------->
2. Cannot cast from ByteArrayInputStream to String
                value = (java.lang.String)(new ByteArrayInputStream((byte[]) ((java.lang.Object)parameter_logobrasao.getValue()))); //$JR_EXPR_ID=25$
                        <-------------------------------------------------------------------------------------------------------->
3. Cannot cast from ByteArrayInputStream to String
                value = (java.lang.String)(new ByteArrayInputStream((byte[]) ((java.lang.Object)parameter_logobrasao.getValue()))); //$JR_EXPR_ID=25$
                        <-------------------------------------------------------------------------------------------------------->

当前代码实现

报表XML配置

<parameter name="logobrasao" class="java.lang.Object"/>
....

<image hAlign="Center" vAlign="Middle">
   <reportElement x="0" y="20" width="557" height="150"/>
   <imageExpression><![CDATA[new ByteArrayInputStream((byte[]) $P{logobrasao})]]></imageExpression>
</image>

Java端参数传递代码

...
logobrasao = getImageBytes();
                
parameters.put("logobrasao", logobrasao);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameter, beanDS);
...

使用版本

  • Jaspersoft Studio 6.21.3
  • jasperreports-3.7.6

解决方案

方案一:修正参数类型并简化表达式

  1. 调整报表参数类型为byte[],避免Object类型带来的隐性转换问题:
<parameter name="logobrasao" class="byte[]"/>
  1. 简化图片表达式,直接基于byte数组生成输入流:
<imageExpression><![CDATA[new ByteArrayInputStream($P{logobrasao})]]></imageExpression>
  1. 确认Java端getImageBytes()方法返回的是byte[]类型,保证参数类型匹配。

方案二:直接传递ByteArrayInputStream

如果允许修改Java端代码,可直接传入输入流,进一步简化报表配置:

  1. Java端生成ByteArrayInputStream并传入参数:
...
ByteArrayInputStream logoStream = new ByteArrayInputStream(getImageBytes());
parameters.put("logobrasao", logoStream);
...
  1. 报表参数类型改为java.io.ByteArrayInputStream:
<parameter name="logobrasao" class="java.io.ByteArrayInputStream"/>
  1. 图片表达式直接引用参数:
<imageExpression><![CDATA[$P{logobrasao}]]></imageExpression>

内容的提问来源于stack exchange,提问作者Val Lins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:21:14