# Probleme mit JasperReports



## ToMu1987 (2. Dez 2010)

Hi, 

ich hab mir vor einiger Zeit vorgenommen, meine Applikation mit einer Reporting-Funktion auszustatten.

Ich benutze iReports 3.7.5 um meine Reports zu designen.  Diese funktionieren in diesem Tool auch, d.h. ich bekomme ein paar Seiten mit Daten aus einer MySQL Datenbank angezeigt. Ich musste auch die Software JasperReports 3.7.5 installieren, welche die Grundlage für iReport ist.


Ich hab mir nun in eine Klasse entwickelt, in der die gesamte Funktionalität zum Aufruf eines solchen Reports zur Verfügung stellt. Sie sieht folgendermaßen aus: 


```
//JasperReports.java
package praktikumprogrammieren.Reporting;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.print.attribute.standard.MediaSize.Engineering;

import net.sf.jasperreports.engine.*;

/**
 *
 * @author Tobi
 * @date 22.10.2010
 */
public class JasperReports {

    //***
    //Variables
    private HashMap<String, Integer> parameter;

    private String strPath;
    private String strFile;

    private Connection conn;

    private JasperReport jasperReport;
    private JasperPrint jasperPrint;


    //***
    //Constructor


    /**
     *
     * @param Path
     * @param File
     */
    public JasperReports(final String Path, final String File) {
        this.strPath = Path;
        this.strFile = File;

        if (!this.strPath.endsWith("\\")) {
            this.strPath += "\\";
        }

        parameter = new HashMap<String, Integer>();
    }

    /**
     *
     * @param Path
     * @param File
     * @param conn
     */
    public JasperReports(final String Path, final String File, Connection conn) {
        this(Path, File);
        this.conn = conn;
    }

    //***
    //Functionality

    /**
     * Adds a string key-pair to the parameter set
     * @param Key
     * @param Value
     */
    public void addParameter(final String strParametername, final int intValue) {
        parameter.put(strParametername, intValue);
    }

    /**
     * 
     */
    public void clearParameters() {
        parameter.clear();
    }

    /**
     * Generates a report in odf format
     */
    public void generateReport() {

        String strOutputFilename = this.strPath + 
                   this.strFile.subSequence(0, this.strFile.length() - 6) + ".pdf";

        String strReportFile = this.strPath + this.strFile;
        
        //before generating an pdf file, checking whether such a file exists
        //if true -> delete it

        try {
            
            jasperReport = JasperCompileManager.compileReport(strReportFile);

            InputStream is = null;

            try {
                 is = new FileInputStream(strReportFile);
            } catch (FileNotFoundException ex) {
                Logger.getLogger(JasperReports.class.getName()).log(Level.SEVERE, null, ex);
            }

            if (this.conn == null)
                jasperPrint = JasperFillManager.fillReport(strReportFile, parameter, new JREmptyDataSource());
            else {                
                jasperPrint = JasperFillManager.fillReport(is, parameter, conn); //hier wird die Exception geworfen
            }
            
            JasperExportManager.exportReportToPdfFile(jasperPrint, strOutputFilename);

        } catch (JRException ex) {
            Logger.getLogger(JasperReports.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}
```


Ich bekomme an der Stelle, an der ich ein JasperFillManager.fillReport(...) (im Code gekennzeichnet)
aufrufe, folgende Exception: 

_

Have no FileObject for C:\Programme\Java\jdk1.6.0\jre\classes
02.12.2010 08:34:00 praktikumprogrammieren.Reporting.JasperReports generateReport
SCHWERWIEGEND: null
net.sf.jasperreports.engine.JRException: Error loading object from InputStream
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:205)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:376)
        at praktikumprogrammieren.Reporting.JasperReports.generateReport(JasperReports.java:117)
        at praktikumprogrammieren.Frames.IFrames.IframeArticles.test(IframeArticles.java:423)
        at praktikumprogrammieren.Frames.IFrames.IframeArticles.access$200(IframeArticles.java:30)
        at praktikumprogrammieren.Frames.IFrames.IframeArticles$MyButtonListener.actionPerformed(IframeArticles.java:519)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Caused by: java.io.StreamCorruptedException: invalid stream header: 3C3F786D
        at java.ibjectInputStream.readStreamHeader(ObjectInputStream.java:783)
        at java.ibjectInputStream.<init>(ObjectInputStream.java:280)
        at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.<init>(ContextClassLoaderObjectInputStream.java:53)
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:200)
        ... 30 more

_

Die Fehlermeldung sagt mir, dass die Methode loadObject anscheinend nicht auf meinen InputStream zugreifen kann. Ich hab dann überprüft, ob die Berichtsdatei irgendwie schreibgeschützt ist. Leider nicht der Fall.

Ich bin mit meinem Latein nun am Ende...

Kann mir jemand helfen oder einen Tipp geben????
MfG Tobi


----------



## ToMu1987 (2. Dez 2010)

Muss ich noch etwas posten? Fehlen Infos?


----------



## nrg (2. Dez 2010)

ist es ausgeschlossen, dass der IS null ist, weil beim Instanziieren eine FNFE geworfen wird, die du aber durch das lokale catchen/loggen übersehen könntest?


----------



## ToMu1987 (2. Dez 2010)

Ja, das ist ausgeschlossen.
Ich befülle das Hashset über die Methode addParameter von außerhalb.


----------



## nrg (2. Dez 2010)

Meinte nicht deine HashMap. Mir gehts um den InputStream.

System.out.println(is != null); in Zeile 110 liefert true?  (edit: Zeilenangabe natürlich anhand deines Posts)

edit: tippfehler


----------



## ToMu1987 (2. Dez 2010)

Ja, das Statement liefert true - der InputStream verweist also nicht auf null....


----------



## zzkozak (10. Dez 2010)

Hi,

 der Fehler ist folgender, du kompilierts den Report und behälst ihn in "jasperReport" ABER weiter unten bei "JasperFillManager.fillReport" benutzt du die "strReportFile" an Stelle des kompilierten "jasperReport".


```
try {
            
            jasperReport = JasperCompileManager.compileReport(strReportFile);
 
            InputStream is = null;
 
            try {
                 is = new FileInputStream(strReportFile);
            } catch (FileNotFoundException ex) {
                Logger.getLogger(JasperReports.class.getName()).log(Level.SEVERE, null, ex);
            }
 
            if (this.conn == null)
                jasperPrint = JasperFillManager.fillReport(strReportFile, parameter, new JREmptyDataSource());
            else {                
                jasperPrint = JasperFillManager.fillReport(is, parameter, conn); //hier wird die Exception geworfen
            }
            
            JasperExportManager.exportReportToPdfFile(jasperPrint, strOutputFilename);
 
        } catch (JRException ex) {
            Logger.getLogger(JasperReports.class.getName()).log(Level.SEVERE, null, ex);
        }
```

 Korrigiere diese Zeile:

```
jasperPrint = JasperFillManager.fillReport(strReportFile, parameter, new JREmptyDataSource());
```

in


```
jasperPrint = JasperFillManager.fillReport(jasperReport, parameter, new JREmptyDataSource());
```

und alles läuft 

Der "JasperFillManager" mag nur kompilierte Reports.

Viele Grüße,
zzkozak


----------



## nrg (10. Dez 2010)

wobei laut javadocs fillReport überlagert sein soll und somit auch einen String bzw. InputStream annimmt...


----------

