You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PrimeFaces与OpenPDF导出PDF时出现NoSuchMethodError问题

PrimeFaces 14.0.3 PDF导出NoSuchMethodError问题排查与解决

问题场景

我正在开发一个使用PrimeFaces 14.0.3进行PDF导出的JSF应用,导出按钮代码如下:

<p:commandButton 
    id="btnPdf" 
    class="m-1 ui-button-info"
    ajax="false"
    rendered="true"
    icon="fas fa-file-pdf"
    value="Export as PDF">
    <p:dataExporter type="pdf" target="tbl" fileName="processional_fees" />
</p:commandButton>

尝试导出DataTable为PDF时,抛出如下错误:

WARNING: StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NoSuchMethodError: 'com.lowagie.text.pdf.PdfPCell com.lowagie.text.pdf.PdfPTable.addCell(com.lowagie.text.pdf.PdfPCell)'
    at org.primefaces.component.datatable.export.DataTablePDFExporter.addCell(DataTablePDFExporter.java:165)
    ...

项目中PDF相关Maven依赖:

<dependency>
    <groupId>com.github.librepdf</groupId>
    <artifactId>openpdf</artifactId>
    <version>1.4.1</version>
</dependency>

已尝试按照PrimeFaces文档建议使用OpenPDF 2.0.3版本,仍出现相同错误。

环境配置:

  • PrimeFaces 14.0.3
  • JSF 2.3
  • Java 11
  • Payara 5

需要解决的问题:

  1. PrimeFaces 14.0.3与OpenPDF在PDF导出方面是否存在已知兼容性问题?
  2. 是否有其他项目依赖干扰PDF生成?
  3. 是否需要在PrimeFaces或OpenPDF中进行额外配置以正确处理PDF导出?

问题解答

1. 兼容性问题说明

PrimeFaces 14.0.3官方指定适配的PDF导出依赖是OpenPDF 2.0.3,本身无官方已知的兼容性问题。你遇到的NoSuchMethodError本质是类版本冲突:PrimeFaces的PDF导出代码依赖的PdfPTable.addCell(PdfPCell)方法返回值为PdfPCell,但运行时加载的OpenPDF版本中该方法签名不匹配(比如旧版本返回void,或API被调整)。

注意:OpenPDF 1.x系列基于旧iText 2.x分支,2.x系列做了API重构,PrimeFaces 14是针对2.x版本适配的,因此不建议使用1.4.1这类旧版本。

2. 依赖干扰排查

该错误大概率由依赖冲突导致:

  • Payara 5内置了旧版本的iText/OpenPDF相关类(com.lowagie.text包下的类),会覆盖项目中引入的兼容版本,导致运行时加载了不匹配的类。
  • 项目其他依赖可能间接引入旧版本的iText或OpenPDF(如报表组件、其他导出工具)。

排查方法:

  • 执行Maven命令 mvn dependency:tree 查看依赖树,搜索com.lowagie或com.github.librepdf相关依赖,找出重复或冲突的版本。
  • 检查Payara安装目录下的domains/domain1/lib文件夹,确认是否存在itext.jar或openpdf.jar,若有则移除或替换为兼容版本。

3. 额外配置建议

PrimeFaces PDF导出无需特殊配置,但需确保依赖和类加载优先级正确:

  • 调整Maven依赖,排除可能冲突的旧iText类:
<dependency>
    <groupId>com.github.librepdf</groupId>
    <artifactId>openpdf</artifactId>
    <version>2.0.3</version>
    <exclusions>
        <exclusion>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 强制Payara优先加载项目中的OpenPDF类,在WEB-INF/glassfish-web.xml中添加配置:
<glassfish-web-app>
    <class-loader delegate="false"/>
</glassfish-web-app>

注意:delegate="false"会改变类加载顺序,可能影响其他依赖,需测试确认。


内容的提问来源于stack exchange,提问作者Buddhika Ariyaratne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:01:12