2010-03-09 8 views
2

J'utilise des API BIRT dans un code program.My java est:NullPointerException tout en utilisant BIRT

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(); 

} 
} 

Mais je suis face à NullPointerException tout en créant le rapport.

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) 

S'il vous plaît aidez-moi au sujet de cette ... ma date limite du projet a été atteint ...

Appréciez votre réponse

Merci à l'avance

Répondre

1

Je ne sais pas si cela vous aidera mais votre la ligne fautive est:

IReportEngine engine = factory.createReportEngine(conf); 

Nous ne codons plus notre propre application web ns pour BIRT (nous utilisons une application web fournie par une autre partie de l'entreprise) mais nous avons trouvé deux différences entre ce que nous avions et ce que nous avions. Si l'un d'eux est une solution, vous devrez vérifier par vous-même. Tous les soins, aucune responsabilité :-)

Les différences sont:

Après avoir réglé la maison du moteur de configuration du journal, mais avant de commencer la plate-forme, nous avons également mis en place un émetteur HTML et le contexte de la plate-forme:

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); 

Gardez à l'esprit que nous courions dans un servlet, et non dans le cadre d'une application autonome. Vous aurez donc probablement besoin de:

IPlatformContext context = new PlatformFileContext(svrContext); 

pour le contexte de la plateforme. Donnez un coup de feu et voyez si cela fonctionne. D'une certaine manière, j'en doute car PlatformFileContext est la valeur par défaut. L'émetteur pourrait être quelque chose à considérer.

La seule autre possibilité que je peux suggérer est d'obtenir réellement le source code for BIRT (your particular build) et jeter un oeil aux lignes fautives dans la trace de la pile. Vous devriez être capable de déterminer quel paramètre peut être à l'origine du problème.

Par exemple, la dernière ligne ReportEngine.java:784 fait partie:

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

il est donc presque certainement que la document adoptée en était nulle. Vous devrez suivre cela à travers les différentes couches pour essayer de découvrir ce qui se passe.

Cela pourrait bien être difficile dans ce cas, vous pouvez être mieux juste raising a bug report et de laisser les experts le manipuler. Ou tracas Jason Weathersby directement si vous pouvez obtenir vos petites mains sales sur son adresse e-mail :-)


En aparté, vous n'avez pas besoin de ces hideux personnages se sont échappés \ dans vos chemins. Java est parfaitement bien dans le traitement (par exemple):

conf.setEngineHome("C:/birt-runtime-2_5_2/ReportEngine"); 
2

je faisais face à un problème similaire et en est sorti la lecture Report Engine API documentation page.

Certaines choses fondamentales sont:

  • dans votre projet dossier ReportEngine, que vous pouvez trouver à l'intérieur télécharger BIRT-exécution: il est tout le moteur que vous avez besoin pour traiter les fichiers .rptdesign et obtenir le rapport en sortie
  • ajouter au chemin de compilation Java tous les pots dans ReportEngine/lib
  • ajouter les pots nécessaires avec les pilotes pour vous connecter à vos BDs dans ReportEngine/plugins/org.eclipse.birt.report.data.oda.jdbc_xxx (inutile de les ajouter au chemin de compilation Java)

Un exemple de code pour produire un rapport HTML est:

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); 
    } 
} 
0

Je sais que cette question est assez vieux, mais je suis tombé sur cette question aujourd'hui et il m'a fallu beaucoup de temps pour comprendre ce que le la cause était. La cause était que j'incluais des dépendances birt/eclipse sur mon classpath. Pour une raison quelconque, cela provoque cette erreur étrange. J'utilise maven et inclure quelques émetteurs personnalisés. Ma solution était de marquer mes dépendances d'éclipse comme "fournies" dans mes poms d'émetteurs personnalisés. Cela a empêché toute éclipse d'entrer dans le classpath, en se basant sur le chargement OSGI de BIRT pour gérer tout ça.

0

J'ai aussi fait face à ce problème qui

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

Je l'ai fait tout ce qui est décrit « bleu », mais l'erreur était toujours présent. J'ai résolu ce problème en téléchargeant et en réinstallant le ReportEngine à partir de here.

Dans mon cas, le dossier de configuration n'était pas présent dans mon plugin. Après avoir ajouté le dossier de configuration à mon plugin, tout allait bien.