将 JasperReports 获取 NullPointerException 到多线程应用程序中

Getting NullPointerException whit JasperReports into a Multi-Thread application

当我尝试以多线程方式使用 JasperReports 时出现此错误。

java.lang.NullPointerException
 at java.awt.color.ICC_Profile.activateDeferredProfile(ICC_Profile.java:1086) ~[?:1.7.0_80]
 at java.awt.color.ICC_Profile.activate(ICC_Profile.java:742) ~[?:1.7.0_80]
 at sun.java2d.cmm.ProfileDeferralMgr.activateProfiles(ProfileDeferralMgr.java:95) ~[?:1.7.0_80]
 at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:775) ~[?:1.7.0_80]
 at com.lowagie.text.Jpeg.processParameters(Unknown Source) ~[redoute-vendororderlifecycle-batch-deliverynotecrt-96.0.jar:96.0.0]
 at com.lowagie.text.Jpeg.<init>(Unknown Source) ~[redoute-vendororderlifecycle-batch-deliverynotecrt-96.0.jar:96.0.0]
 at com.lowagie.text.Image.getInstance(Unknown Source) ~[redoute-vendororderlifecycle-batch-deliverynotecrt-96.0.jar:96.0.0]
 at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processImageRetainShape(JRPdfExporter.java:1742)

这是 Java 自 1.6

以来的错误

Loading ICC color profiles from multiple threads sometimes triggers a null pointer exception inside the JRE's ICC_Profile class.

此时我通过将 JasperReports Export to PDF 函数调用到 Syncronized 函数中来解决它,但这就像多线程应用程序中的瓶颈。

@fabiofdsantos 在 GitHub 上说:

"Since jasperreports is using Lowagie (deprecated since 2012), a possible workaround is to call Image.getInstance(renderer.getData(jasperReportsContext)); synchronized."

但我不知道如何使用 JasperReports 来实现,就像他最后使用同步方法一样,但也许是比我更好的解决方案。

我通过将所有 JPEG 图像重新放置到我的项目中来解决这个问题,这些图像被 jasper 文件使用。我使用 PNG 图像而不是 JPEG。即使我不需要使用同步方法。