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
解决方案
方案一:修正参数类型并简化表达式
- 调整报表参数类型为
byte[],避免Object类型带来的隐性转换问题:
<parameter name="logobrasao" class="byte[]"/>
- 简化图片表达式,直接基于byte数组生成输入流:
<imageExpression><![CDATA[new ByteArrayInputStream($P{logobrasao})]]></imageExpression>
- 确认Java端
getImageBytes()方法返回的是byte[]类型,保证参数类型匹配。
方案二:直接传递ByteArrayInputStream
如果允许修改Java端代码,可直接传入输入流,进一步简化报表配置:
- Java端生成ByteArrayInputStream并传入参数:
... ByteArrayInputStream logoStream = new ByteArrayInputStream(getImageBytes()); parameters.put("logobrasao", logoStream); ...
- 报表参数类型改为
java.io.ByteArrayInputStream:
<parameter name="logobrasao" class="java.io.ByteArrayInputStream"/>
- 图片表达式直接引用参数:
<imageExpression><![CDATA[$P{logobrasao}]]></imageExpression>
内容的提问来源于stack exchange,提问作者Val Lins
相关产品推荐
相关产品推荐

