我的任务是迁移一个使用 Apache FOP 1.1 的旧 Java 应用程序。我想使用最新的 FOP 版本 2.1,但设置 FOP 的代码有问题。
这是我们使用 1.1 API 的原始代码:
FopFactory fopFactory = FopFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ConfigurationDataUtility configurationData = new ConfigurationDataUtility();
try
{
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
这是使用 2.1 API 的新代码:
InputStream is = getClass().getClassLoader().getResourceAsStream("fop.xconf");
FopConfParser parser = new FopConfParser(is, new java.net.URI(".")); //parsing configuration
FopFactoryBuilder builder = parser.getFopFactoryBuilder(); //building the factory with the user options
FopFactory fopFactory = builder.build();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ConfigurationDataUtility configurationData = new ConfigurationDataUtility();
try
{
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
可悲的是,FOP 在其网站上的文档很少,而且主要是针对 1.1 版的。上面的代码是从他们的页面中获取的目录,在说明如何从 1.1 迁移到 2.1 的部分中,所以我认为它是正确的。
https://xmlgraphics.apache.org/fop/2.1/upgrading.html
问题是,当执行这个新代码时,在构造新 FopConfParser的行上会抛出以下异常:
Caused by: java.lang.Error: Unable to setup SAX parserjava.lang.ClassCastException: __redirected.__SAXParserFactory cannot be cast to javax.xml.parsers.SAXParserFactory
at org.apache.avalon.framework.configuration.DefaultConfigurationBuilder.<init>(DefaultConfigurationBuilder.java:112)
at org.apache.avalon.framework.configuration.DefaultConfigurationBuilder.<init>(DefaultConfigurationBuilder.java:83)
at org.apache.fop.apps.FopConfParser.<init>(FopConfParser.java:146)
at org.apache.fop.apps.FopConfParser.<init>(FopConfParser.java:88)
at org.apache.fop.apps.FopConfParser.<init>(FopConfParser.java:103)
at xmltools.PDFGenerator.generatePDF(PDFGenerator.java:73)
at defect.DefectServlet.generateDefectPrintablePdf(DefectServlet.java:703)
... 35 more
我们正在运行 Wildfly 9 作为我们的服务器。因此,我在 FOP 的 module.xml 文件中添加了以下内容,因为没有它们,我得到了ClassNotFound异常:
<dependencies>
<module name="org.apache.avalon" />
<module name="org.xml.sax" />
<module name="org.apache.xmlgraphics" />
</dependencies>
我已将以下内容添加到我的 JVM 启动中,希望它能更清楚地说明这种情况,但事实并非如此:
-Djaxp.debug=1
我已经在 3 天的大部分时间里一直在研究这个问题,但没有取得任何进展。任何建议将不胜感激。
谢谢。