Загрузка файла jrxml под Tomcat

У меня есть веб-приложение, которое использует JasperReports для экспорта данных в Excel, PDF и CSV. Это приложение Grails, использующее плагин DynamicJasperReports, и оно использует файл jrxml в качестве шаблона для отчета.

Это работало, но сломалось после некоторых изменений в нашей конфигурации tomcat. Он все еще работает локально в режиме разработки Grails.

FastReportBuilder drb = new FastReportBuilder()
drb.setTemplateFile("resources/reportTemplate.jrxml")

DynamicReport report = reportBuilder.call(drb)

JRDataSource ds = new JRMapCollectionDataSource(data)

JasperPrint jp = DynamicJasperHelper.generateJasperPrint(report, new ClassicLayoutManager(), ds)
ReportWriter reportWriter = ReportWriterFactory.getInstance().getReportWriter(jp, format, [:])
reportWriter.writeTo(response)

Выдает эту ошибку:

java.lang.NullPointerException
at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperDesign(DynamicJasperHelper.java:151)
at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:448)
at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperPrint(DynamicJasperHelper.java:234)
at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperPrint(DynamicJasperHelper.java:187)
at com.giivpro.services.analytics.JasperReportsService.runReport(JasperReportsService.groovy:30)

1 ответ

В конце концов я понял, что это произошло не из-за обновления до tomcat7, как я первоначально думал, а из-за изменений в развертывании приложения, сделанных примерно в то же время.

Все зависимости jar-файла приложения теперь копируются в /var/lib/tomcat/lib, а не развертываются внутри файла war. Это означает, что строка в DynamicJasperHelper

URL url = DynamicJasperHelper.class.getClassLoader().getResource(dr.getTemplateFileName());

теперь не удалось из-за ограничений безопасности ClassLoader. Банки в /var/lib/tomcat/lib загружаются отдельным ClassLoader и не могут загружать ресурсы из определенных файлов WAR.

Другие вопросы по тегам