Облицовка NullPointerException при использовании BIRT - PullRequest
2 голосов
/ 09 марта 2010

Я использую BIRT API в Java-программе. Мой код:

package com.tecnotree.mdx.product.utils;

import java.util.HashMap;
import java.util.logging.Level;

import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.ReportEngine;


public class ExampleReport {

 public static void main(String[] args) {
  // Variables used to control BIRT Engine instance

  ReportEngine eng = null;
  IReportRunnable design = null;
  IRunAndRenderTask task = null;
  HTMLRenderOption renderContext = null;
  HashMap contextMap = null;
  HTMLRenderOption options = null;
  final EngineConfig conf = new EngineConfig();
  conf
    .setEngineHome("C:\\birt-runtime-2_5_2\\birt-runtime-2_5_2\\ReportEngine");
  System.out.println("conf " + conf.getBIRTHome());

  conf.setLogConfig(null, Level.FINE);
  try {
   Platform.startup(conf);
  } catch (BirtException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }


  IReportEngineFactory factory = (IReportEngineFactory) Platform
    .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
  System.out.println("Factory : " + factory.toString());
  System.out.println(conf.toString());
  IReportEngine engine = factory.createReportEngine(conf);
  System.out.println("Engine : " + engine);

  try {
   design = eng
     .openReportDesign("C:\\birt-runtime-2_5_2\\birt-runtime-2_5_2\\ReportEngine\\samples\\hello_world.rptdesign");
  } catch (Exception e) {
   System.err
     .println("An error occured during the opening of the report file!");
   e.printStackTrace();
   System.exit(-1);
  }
  task = eng.createRunAndRenderTask(design);
  renderContext = new HTMLRenderOption();
  renderContext.setImageDirectory("image");
  contextMap = new HashMap();
  contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT,
    renderContext);
  task.setAppContext(contextMap);

  options = new HTMLRenderOption();
  options.setOutputFileName("c:/temp/output.html");
  options.setOutputFormat("html");
  task.setRenderOption(options);
  try {
   task.run();
  } catch (Exception e) {
   System.err.println("An error occured while running the report!");
   e.printStackTrace();
   System.exit(-1);
  }
  System.out.println("All went well. Closing program!");
  eng.destroy();

 }
}

Но я сталкиваюсь с NullPointerException при создании отчета.

STACKTRACE :
Exception in thread "main" java.lang.NullPointerException
 at org.eclipse.birt.report.engine.api.impl.ReportEngine$EngineExtensionManager.<init>(ReportEngine.java:784)
 at org.eclipse.birt.report.engine.api.impl.ReportEngine.<init>(ReportEngine.java:109)
 at org.eclipse.birt.report.engine.api.impl.ReportEngineFactory$1.run(ReportEngineFactory.java:18)
 at org.eclipse.birt.report.engine.api.impl.ReportEngineFactory$1.run(ReportEngineFactory.java:1)
 at java.security.AccessController.doPrivileged(Native Method)
 at org.eclipse.birt.report.engine.api.impl.ReportEngineFactory.createReportEngine(ReportEngineFactory.java:14)
 at com.tecnotree.mdx.product.utils.ExampleReport.main(ExampleReport.java:47)

Пожалуйста, помогите мне в этом ... мой срок выполнения проекта был достигнут ...

Ценю ваш ответ

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 16 мая 2011

Я столкнулся с подобной проблемой и вышел из нее, прочитав Страница документации API Report Engine .

Некоторые фундаментальные вещи:

  • место в вашем проекте папка ReportEngine , которую вы можете найти внутри загрузки birt-runtime: это все ядро, которое вам нужно для обработки файлов .rptdesign и получения отчета в качестве вывода
  • добавить в путь сборки Java все файлы jar в ReportEngine / lib
  • добавить необходимые файлы jar с драйверами для подключения к вашим базам данных в ReportEngine / plugins / org.eclipse.birt.report.data.oda.jdbc_xxx (нет необходимости добавлять их в путь сборки Java)

Пример кода для создания отчета в формате HTML:

import java.util.HashMap;
import java.util.logging.Level;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.engine.api.*;

/**This class reads an .rptdesign file, 
 * and gives as output a report in HTML format 
 */
public class BirtEngineDesktop {

    public static void main(String[] args) {
        // Variables used to control BIRT Engine instance
        String reportName = "first_report.rptdesign";
        IReportEngine engine = null;
        IReportRunnable design = null;
        IRunAndRenderTask task = null;
        HTMLRenderOption renderContext = null;
        HashMap contextMap = null;
        HTMLRenderOption options = null;
        final EngineConfig conf = new EngineConfig();
        conf.setEngineHome("ReportEngine");
        System.out.println("BIRT_HOME: " + conf.getBIRTHome());
        conf.setLogConfig(null, Level.FINE);

        try {
            Platform.startup(conf);
        } catch (BirtException e1) {
            e1.printStackTrace();
        }

        IReportEngineFactory factory = (IReportEngineFactory) Platform
                .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
        System.out.println("Factory: " + factory.toString());
        System.out.println(conf.toString());
        engine = factory.createReportEngine(conf);
        System.out.println("Engine: " + engine);

        try {
            design = engine.openReportDesign("report/" + reportName); //report is needed in this folder
        } catch (Exception e) {
            System.err.println("An error occured during the opening of the report file!");
            e.printStackTrace();
            System.exit(-1);
        }
        task = engine.createRunAndRenderTask(design);
        renderContext = new HTMLRenderOption();
        renderContext.setImageDirectory("images");
        contextMap = new HashMap();
        contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT,
                renderContext);
        task.setAppContext(contextMap);

        //Set parameter values and validate, if the report requires it
        //task.setParameterValue("Years", 2.0);
        //task.validateParameters();

        options = new HTMLRenderOption();
        options.setOutputFileName("output/" + reportName + ".html"); //output HTML will go to this folder
        options.setOutputFormat("html");
        task.setRenderOption(options);
        try {
            task.run();
        } catch (Exception e) {
            System.err.println("An error occured while running the report!");
            e.printStackTrace();
            System.exit(-1);
        }
        System.out.println("All went well. Closing program!");
        engine.destroy();
        System.exit(0);
    }
}
1 голос
/ 29 апреля 2010

Не уверен, поможет ли это, но ваша оскорбительная строка:

IReportEngine engine = factory.createReportEngine(conf);

Мы больше не кодируем наши собственные веб-приложения для BIRT (мы используем веб-приложение, предоставленное другой частью компании), но копая наш старый код, мы обнаружили два различия между тем, что у нас было, и тем, что у вас есть. Является ли один из них исправлением, вы должны проверить сами. Все заботы, никакой ответственности: -)

Различия:

После установки движка конфигурации журнала дома, но перед запуском платформы, мы также настроили эмиттер HTML и контекст платформы:

HTMLEmitterConfig emitterConfig = new HTMLEmitterConfig();
emitterConfig.setActionHandler (new HTMLActionHandler());
HTMLServerImageHandler imageHandler = new HTMLServerImageHandler();
emitterConfig.setImageHandler (imageHandler);
conf.getEmitterConfigs().put ("html", emitterConfig);

IPlatformContext context = new PlatformServletContext( svrContext );
conf.setPlatformContext( context );

Имейте в виду, что мы работали в сервлете, а не как часть отдельного приложения. Так что вам, вероятно, понадобится:

IPlatformContext context = new PlatformFileContext( svrContext );

для контекста платформы. Сделайте это и посмотрите, работает ли это. Почему-то я в этом сомневаюсь, так как PlatformFileContext используется по умолчанию. Эмитент может быть что-то, чтобы рассмотреть, хотя.

Единственная другая возможность, которую я могу предложить, - это на самом деле получить исходный код для BIRT (вашей конкретной сборки) и взглянуть на ошибочные строки в трассировке стека. Надеемся, вы сможете выяснить, какой параметр может вызывать проблему.

Например, последняя строка ReportEngine.java:784 является частью:

void cacheOpenedDocument( ReportDocumentReader document ) {
    synchronized ( openedDocuments ) {
        LinkedEntry<ReportDocumentReader> entry
            = openedDocuments.add( document );
        document.setEngineCacheEntry( entry ); // << line 784
    }
}

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

Это может быть довольно сложно, и в этом случае вам может быть лучше просто поднять отчет об ошибке и позволить экспертам справиться с этим. Или напрямую хлопотайте по Джейсону Уэзерсби, если вы можете получить свои грязные маленькие руки на его адрес электронной почты: -)


Кроме того, вам не нужны эти отвратительные \ символы в ваших путях. Java прекрасно справляется с (например):

conf.setEngineHome("C:/birt-runtime-2_5_2/ReportEngine");
0 голосов
/ 11 июля 2012

Я тоже сталкивался с такой проблемой, что

IReportEngine engine = factory.createReportEngine(conf);
//was null everytime.

Я сделал все, что описал «голубоватый», но ошибка все еще присутствовала. Я решил эту проблему, загрузив и переустановив ReportEngine с здесь.

В моем случае папка конфигурации отсутствовала в моем плагине. После добавления папки настроек в мой плагин все было хорошо.

0 голосов
/ 01 июня 2011

Я знаю, что этот вопрос довольно старый, но я столкнулся с этим вопросом сегодня, и мне потребовалось много времени, чтобы понять причину. Причина была в том, что я включил некоторые зависимости birt / eclipse в моем classpath. По какой-то причине это вызывает эту странную ошибку. Я использую Maven и включаю пару пользовательских излучателей. Мое решение состояло в том, чтобы пометить мои зависимости затмения как «предоставленные» в моих пользовательских помпах эмиттера. Это удерживало все затмения от попадания в путь к классам, вместо этого полагаясь на загрузку OSGI BIRT для обработки всего этого.

...