Это мой первый раз, когда я использую двигатель BIRT. Я сосредоточился на проблеме с использованием POJO.Отчет BIRT с использованием POJO unning под tomcat
У меня есть простой POJO:
class Parent {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
И простой отчет BIRT который только печатает имя родителя (я печатаю имя только для 1 Родителя, это значит - я посылаю список только с 1 записями).
Я успешно создаю PDF с родительским именем, используя тесты JUnit, а когда я пытаюсь сгенерировать его в Tomcat - BIRT не вставляет значения из POJO.
Вы когда-нибудь занимались этой проблемой?
Birt обертка класс:
public class BirtRenderer implements IBirtRenderer {
private EngineConfig config;
private IReportEngine engine;
private IReportEngineFactory factory;
public BirtRenderer() throws BirtException {
config = new EngineConfig();
config.setLogConfig("J:\\BirtLogs", Level.WARNING);
// config.setLogger(new Log4jHandler());
Platform.startup(config);
factory = (IReportEngineFactory) Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
engine = factory.createReportEngine(config);
}
public void destroy() {
engine.destroy();
Platform.shutdown();
}
public ByteArrayOutputStream executeReport(String reportName, String fileFormat, @SuppressWarnings("rawtypes") Map context) throws EngineException {
return executeReport(reportName, fileFormat, context, Locale.US);
}
public ByteArrayOutputStream executeReport(String reportName, String fileFormat, @SuppressWarnings("rawtypes") Map context, Locale locale) throws EngineException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
reportName = reportName + ".rptdesign";
/* for testing */
context = new HashMap();
ArrayList list = new ArrayList();
list.add(new TitleCustomerDao().next());
context.put("APP_CONTEXT_KEY_TITLE_CUSTOMER_DATA", list);
/* for testing end */
InputStream reportStream = this.getClass().getClassLoader().getResourceAsStream(reportName);
if (reportStream == null)
throw new EngineException(new BirtException("File '" + reportName + "' was not found."));
// Open the report design
IReportRunnable design = null;
// design =
// engine.openReportDesign("J:/birt-workspace/test/hello_world.rptdesign");
design = engine.openReportDesign(reportStream);
IRunAndRenderTask task = engine.createRunAndRenderTask(design);
// task.setParameterValue("Top Count", (new Integer(5)));
// task.validateParameters();
RenderOption renderOption = getRenderOption(fileFormat);
renderOption.setOutputStream(outputStream);
task.setRenderOption(renderOption);
// task.setParameterValue("APP_CONTEXT_KEY_PARENTS", data);
task.setAppContext(context);
if (locale != null)
task.setLocale(locale);
if (!task.validateParameters()) {
throw new IllegalArgumentException("Parameters do not validate");
}
task.run();
task.close();
return outputStream;
}
private RenderOption getRenderOption(String fileFormat) {
if (fileFormat.equalsIgnoreCase("pdf")) {
PDFRenderOption PDF_OPTIONS = new PDFRenderOption();
// PDF_OPTIONS.setOutputFileName("J:/birt-workspace/test/hello_world.pdf");
PDF_OPTIONS.setOutputFormat("pdf");
return PDF_OPTIONS;
} else if (fileFormat.equalsIgnoreCase("html")) {
HTMLRenderOption HTML_OPTIONS = new HTMLRenderOption();
// HTML_OPTIONS.setOutputFileName("J:/birt-workspace/test/hello_world.html");
HTML_OPTIONS.setOutputFormat("html");
return HTML_OPTIONS;
} else
return null;
}
}
После длительного расследования я нашел, где проблема.
Проблема в том, что я использую библиотеку Apache FOP в том же веб-проекте, где я использую BIRT. Если мы перейдем к деталям - проблема с библиотекой Apache Batik, которая используется Apache FOP 1.0 (использует> = 1,7 батик) & BIRT 4.4.2 (использует 1.6).
И действительно странно, почему BIRT Runtime Java-библиотека внутри переопределяет группу BatikИндикалы и артефакты.
Есть ли у вас какие-либо предложения, как можно использовать Apache FOP & BIRT 4.4.2 Runtime Java-библиотека в том же веб-проекте?
Это также зависит от того, какую зависимость вы указываете сверху.
С помощью этого отчета pom.xml PDF генерируется успешно и все POJO данные переплетены правильно:
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>org.eclipse.birt.runtime</artifactId>
<version>4.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
С помощью этого отчета pom.xml PDF визуализируется с пустыми полями POJO данных:
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>org.eclipse.birt.runtime</artifactId>
<version>4.4.2</version>
</dependency>
Это, скорее всего, проблема с classpath, где вы положили банку, содержащую это pojo в Tomcat? Где код, запускающий отчет: находится ли он в том же webapp, что и механизм birt или в отдельном веб-приложении? – Dominique
Этот банкомат оболочки POJO & BIRT (используемый для создания и конфигурирования двигателя) находится в WEB-INF \ lib forlder. Данные поступают от контроллеров, которые помещаются в классы WEB-INF \. – xsiraul
Можете ли вы показать код, создающий и настраивающий движок BIRT? Я думаю, я знаю, почему это не работает, но я хочу быть уверенным. – Dominique