The problem occurs when retrieving images using the Image component with an url to an image that results in 404 not found. The report library disregards the status code and reads the content anyway. That content is often a html page explaining that the image is no longer available. It feeds the html and tries so interpret it as a image. As a result, the batik library is loaded and is asked to determine if the image is an svg image.
We do not ship the batik library along with the report library. As a result a NoClassDefFoundError occurs (see stack trace below).
We expect that the library checks the status code and simply returns an error in case of a 404. This error can then be captured using the 'on error type' property of the image component.
To illustrate the problem we added an example report called imageurlpointstohtmlpage.jrxml .
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/batik/bridge/UserAgent
at net.sf.jasperreports.renderers.util.RendererUtil.getSvgDataSniffer(RendererUtil.java:148)
at net.sf.jasperreports.renderers.util.RendererUtil.isSvgData(RendererUtil.java:107)
at net.sf.jasperreports.renderers.util.RendererUtil.isSvgData(RendererUtil.java:137)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1575)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access$300(JRPdfExporter.java:1532)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1472)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1090)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1053)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:917)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:537)
....
Caused by: java.lang.ClassNotFoundException: org.apache.batik.bridge.UserAgent
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 16 more
Recommended Comments