2016-02-11 6 views
1

Мне было поручено перенести старое приложение Java, которое использует Apache FOP 1.1. Я бы хотел использовать последнюю версию FOP, 2.1, но у меня проблемы с кодом, который устанавливает FOP.Apache FOP 1.1> 2.1 Миграция

Вот исходный код, который мы имеем, используя 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); 

К сожалению, ФОП имеет очень мало документации по его веб-сайт и то, что есть в основном для версии 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, как наш сервер. Таким образом, я добавил следующее в файл module.xml ФОП, потому что я получаю ClassNotFound исключения без них:

<dependencies> 
     <module name="org.apache.avalon" /> 
     <module name="org.xml.sax" /> 
     <module name="org.apache.xmlgraphics" /> 
    </dependencies> 

Я добавил следующее моего запуска виртуальной машины Java, надеясь, что это будет пролить больше света на ситуацию, но это не так:

-Djaxp.debug=1 

Я смотрел на это для лучшей части 3 дня теперь не достигнутого прогресса. Любые предложения будут высоко ценится.

Спасибо.

ответ

0

Это работает для меня, изменяя несколько строк, связанных с парсера следующим образом:

File xconf = new File("\\myapp\\conf\\fop.xconf"); 
FopConfParser parser = new FopConfParser(xconf); 
FopFactoryBuilder builder = parser.getFopFactoryBuilder(); 
Смежные вопросы