生成 JasperReport 的报告时出现 NoSuchMethodError

NoSuchMethodError while generating JasperReport's report

我正在使用 JasperReports 库生成 PDF 报告。在这份报告中,我有一个 QRCode,这会造成问题。我不得不添加许多库:

jasperreports、itext、itext-pdfa、itext-pdf、commons-beanutils、commons-collections、commons-digester、commons-logging、groovy-all、烧烤、条形码、barcode4j、batik-anim , batik-bridge, core, w3c.css.sac, w3c,xmlgraphics-commons, batik-all

我收到异常:

java.lang.ClassCastException: org.apache.batik.anim.dom.SVGOMDocument cannot be cast to org.apache.batik.dom.svg.SVGOMDocument
at org.apache.batik.bridge.BridgeContext.setDocument(Unknown Source)
at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
at net.sf.jasperreports.renderers.AbstractSvgDataToGraphics2DRenderer.ensureSvg(AbstractSvgDataToGraphics2DRenderer.java:166)
at net.sf.jasperreports.renderers.AbstractSvgDataToGraphics2DRenderer.getDimension(AbstractSvgDataToGraphics2DRenderer.java:111)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processGraphics2D(JRPdfExporter.java:1793)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1582)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access0(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 reports.JasperReport.generatePdf(JasperReport.java:178)

怎么了?

如果这是您自己的代码(您编写的),那只是因为您导入了错误的 SVGOMDocument class(属于不同的 Java 包)。 您应该能够使用体面的 Java IDE(Eclipse、IntelliJ、NetBeans)快速解决这个问题。

此外,尽可能避免隐式导入,例如:

import org.apache.batik.dom.svg.*;
import org.apache.batik.anim.dom.*;

这可能会降低您的代码稳定性,例如上面添加的行可能会改变您对现有工作代码的引用。 使用显式导入 (import org.apache.batik.dom.svg.SVGOMDocument).

找出您调用的方法的 return 类型,并从正确的 Java 包中导入。在 Eclipse IDE 中,您只需删除包含上述 package/class 的导入,然后选择 Source > Organize Imports (Ctrl-Shift-O)。

如果您在单个源代码文件中同时拥有两个 class,您可能需要为其中一个 class 使用完整的 class 名称,例如:

org.apache.batik.dom.svg.SVGOMDocument document = SomeLibrary.getSomething();