目录【知识星球】
1.1、错误描述
1.2、解决方案
1.1、错误描述
最近在工作中,使用JasperReports报表比较多一些,有次线上环境里面运行报错,查看报错日志,如下所示:
net.sf.jasperreports.engine.JRException: Byte data not found at: xxxx.png.\r\n\tat
net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(RepositoryUtil.java:215)\r\n\tat
net.sf.jasperreports.renderers.util.RendererUtil.getNonLazyRenderable(RendererUtil.java:179)\r\n\tat
net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:512)\r\n\tat
net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:437)\r\n\tat
net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:383)\r\n\tat
net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:548)\r\n\tat
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2613)\r\n\tat
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:836)\r\n\tat
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:275)\r\n\tat
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:119)\r\n\tat
net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:622)\r\n\tat
net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFiller.java:433)\r\n\tat
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:162)\r\n\tat
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:145)\r\n\tat
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:758)\r\n\tat
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:1074)\r\n\tat
从报错日志里面,可以大概看出是在调用fillReport()方法,填充报表数据的时候,读取不到xxx.png图片所导致的报错。于是我就是使用Jasper Studio报表工具打开jasper模板文件,然后查看里面是否有使用Image图片组件的地方,果然是有使用Image图片组件。
一开始我以为是图片名称使用了中文所导致的,于是我就先修改图片名称为英文字母,将重新编译之后的jasper模板文件发到服务器上运行,发现还是一样的报错,到这里,基本上就可以排除是中文名称的问题了。
既然不是图片名称的问题,那就还有一种情况了,那就是图片的路径写的不对,于是我查看图片的路径地址,居然是直接写了一个图片名称,我就去服务器上查看图片保存在哪个目录下,发现图片是保存在【report/xxx/xxx.png】的路径,改成这个路径之后,重新运行就不报错了。
最终,找到的原因是:jasper模板文件中使用了Image图片组件,但是这个图片的路径地址不完整,直接写了一个图片名称,在服务器上运行时候,需要写完整的路径地址。
1.2、解决方案
修改jasper模板文件中的图片路径地址,要加上完整的路径,例如:你的报表模板是放在服务器上的report/demo目录下面,并且图片也放在这个目录下,那么你就要写完整的图片路径地址:"report/demo/java.png"。
到此,JasperReports渲染报表文件时候,读取图片报错问题就解决啦。