2015-04-02 1 views
1

Это мой первый раз, когда я использую двигатель 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> 
+0

Это, скорее всего, проблема с classpath, где вы положили банку, содержащую это pojo в Tomcat? Где код, запускающий отчет: находится ли он в том же webapp, что и механизм birt или в отдельном веб-приложении? – Dominique

+0

Этот банкомат оболочки POJO & BIRT (используемый для создания и конфигурирования двигателя) находится в WEB-INF \ lib forlder. Данные поступают от контроллеров, которые помещаются в классы WEB-INF \. – xsiraul

+0

Можете ли вы показать код, создающий и настраивающий движок BIRT? Я думаю, я знаю, почему это не работает, но я хочу быть уверенным. – Dominique

ответ

0

Хорошо, я нашел проблему.

Проблема была в Java-библиотеках. Apache FOP использует Apache Batik, у которого есть артефакт batik-js. Это шея бутылки, потому что библиотека Runtime BIRT использует более новую версию.

Было очень сложно найти проблему, потому что BIRT Runtime использует «org.mozilla.javascript-1.7.2.jar», в то время как FOP использует «batik-js-1.7.jar». Оба они сохраняют одни и те же классы Java.

Так Java ClassLoader взял более старую версию (версию FOP) jar, когда мы указываем зависимость FOP от TOP.

Вопрос о том, почему разработчики BIRT Runtime создали различные артефакты maven с теми же Java-классами.

Так что мой новый pom.xml является:

<dependency> 
     <groupId>org.apache.xmlgraphics</groupId> 
     <artifactId>fop</artifactId> 
     <version>1.0</version> 
     <exclusions> 
      <exclusion> 
       <artifactId>batik-js</artifactId> 
       <groupId>org.apache.xmlgraphics</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.eclipse.birt.runtime</groupId> 
     <artifactId>org.eclipse.birt.runtime</artifactId> 
     <version>4.4.2</version> 
    </dependency> 

И все теперь работает!

0

Я думаю, что ваш POJO не работает в Tomcat, потому что вы забыли предоставить загрузчик классов для двигателя BIRT. Попробуйте добавить следующее:

import org.eclipse.birt.report.engine.api.EngineConstants; 

и в конструкторе:

config.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, BirtRenderer.class.getClassLoader()); 
+0

Прошу вас заметить, но это не влияет. Я попробовал много различных опций, также я попытался добавить загрузчик классов в контекст в методе executeReport. Это не решает проблемы. – xsiraul

+0

Как насчет журналов двигателя birt, есть ли какие-нибудь подсказки? – Dominique

+0

Файлы журнала BIRT пустые в уровне ПРЕДУПРЕЖДЕНИЕ. – xsiraul

Смежные вопросы