不确定问题出在DynamicJasper或JasperReport上。 我正在使用这个版本:
<dependency>
<groupId>ar.com.fdvs</groupId>
<artifactId>DynamicJasper</artifactId>
<version>5.1.0</version>
</dependency>
像这样创建动态报告:
DynamicReportBuilder drb = new DynamicReportBuilder();
Integer margin = 20;
drb.setTitleStyle(titleStyle)
.setTitle(tabularConfig.getTitle()) //defines the title of the report
.setSubtitle(tabularConfig.getSubTitle())
.setDetailHeight(15)
.setLeftMargin(margin)
.setRightMargin(margin)
.setTopMargin(margin)
.setBottomMargin(margin)
.setUseFullPageWidth(true)
.setPrintBackgroundOnOddRows(true)
.setOddRowBackgroundStyle(oddRowStyle)
.addFirstPageImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/logo_fdv_solutions_60.jpg", 197, 60, ImageBanner.Alignment.Left)
.addFirstPageImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/dynamicJasper_60.jpg", 300, 60, ImageBanner.Alignment.Right)
.addImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/logo_fdv_solutions_60.jpg", 100, 25, ImageBanner.Alignment.Left, ImageScaleMode.FILL)
.addImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/dynamicJasper_60.jpg", 150, 25, ImageBanner.Alignment.Right, ImageScaleMode.FILL)
.addFooterImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/dynamicJasper_60.jpg", 150, 25, ImageBanner.Alignment.Right, ImageScaleMode.FILL);
导出报告如下:
JasperReport jr = DynamicJasperHelper.generateJasperReport(drb.build(), new ClassicLayoutManager(), params);
JasperPrint jp = JasperFillManager.fillReport(jr, params, new JRBeanCollectionDataSource(pdfGenRequest.getData()));
JasperExportManager.exportReportToPdfFile(jp, "out_" + pdfGenRequest.getPartitionIndex() + ".pdf");
我偶尔会看到这个错误(当有多个线程生成报告时)。
net.sf.jasperreports.engine.JRException: java.lang.NullPointerException
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processImageRetainShape(JRPdfExporter.java:1750)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1607)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access$300(JRPdfExporter.java:1535)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1475)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1093)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1056)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:920)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:537)
at net.sf.jasperreports.engine.JasperExportManager.exportToPdfFile(JasperExportManager.java:155)
at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:503)
at com.cisco.exporter.pdf.JasperPdfGenerator.generatePdf(JasperPdfGenerator.java:98)
at com.cisco.exporter.pdf.PdfGeneratorVerticle.generatePdf(PdfGeneratorVerticle.java:34)
at io.vertx.rxjava.core.eventbus.EventBus$3.handle(EventBus.java:241)
at io.vertx.rxjava.core.eventbus.EventBus$3.handle(EventBus.java:239)
at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:212)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:191)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$3(EventBusImpl.java:505)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:337)
at io.vertx.core.impl.TaskQueue.lambda$new$0(TaskQueue.java:60)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at java.awt.color.ICC_Profile.activateDeferredProfile(ICC_Profile.java:1090)
at java.awt.color.ICC_Profile$1.activate(ICC_Profile.java:744)
at sun.java2d.cmm.ProfileDeferralMgr.activateProfiles(ProfileDeferralMgr.java:95)
但上面代码中显示的所有变量都是本地(线程安全)变量。但内部(不确定在哪里),某些东西不是线程安全的。这始终与单线程一致。此外,如果我删除图像横幅相关代码,即使它是多线程的,它也能正常工作。有什么指针吗?