Apache FOP 1.1> 2.1迁移

时间:2016-02-11 20:28:58

标签: apache sax apache-fop wildfly-9

我的任务是迁移使用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,所以我认为这是正确的。

How to deserialize JSON with unnamed collection of types using DataContractSerializer

问题在于,当执行此新代码时,在构造 new 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天的大部分时间里一直在关注这个问题而没有取得任何进展。任何建议将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

这对我来说可以通过这种方式改变与解析器相关的几行:

File xconf = new File("\\myapp\\conf\\fop.xconf"); 
FopConfParser parser = new FopConfParser(xconf);
FopFactoryBuilder builder = parser.getFopFactoryBuilder();