Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615

    [Java] Problema apertura report

    Carissimi,
    la mia web app in Java funziona benissimo in locale ed anche in remoto (la configurazione, la JDK ecc è identica, sul mio pc ho riprodotto lo stesso ambiente esistente in remoto).

    Tutto funziona, ma se apro un report in locale tutto funziona (in diversi formati, in stream ecc, tutto benissimo). In remoto vedo questo errore:

    codice:
    java.lang.NullPointerException
    	java.io.File.<init>(File.java:180)
    	net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:230)
    	servletReport.ServletReportStreamPDF.doGet(ServletReportStreamPDF.java:72)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    La riga incriminata, che in locale funziona benissimo, è la 72 di una mia servlet ed è questa:

    codice:
    jp = JasperFillManager.fillReport(context.getRealPath(rptFolder + rptFileName + ".jasper"), parameters, Conn);
    Mi incuriosisce, in particolare, la riga dell'errore che riporta java.io.File.<init>(File.java:180). Però ribadisco, in locale tutto funziona benissimo. Secondo voi da cosa potrebbe dipendere?
    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Problema apertura report

    Originariamente inviato da Shadow976
    Mi incuriosisce, in particolare, la riga dell'errore che riporta java.io.File.<init>(File.java:180).
    L'unica cosa che si può dedurre è che al costruttore di File è stato passato un null. Il perché ... bisogna vedere.

    Tu a fillReport() passi il risultato di getRealPath() e la sua documentazione dice: This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Grazie infinite per la tua cortesia. Sto preparandoti una descrizione più dettagliata, così forse ti sarà più agevole capire dove ho sbagliato. Dammi due minuti!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Dunque, ecco una descrizione più esaustiva del problema. Sto creando una web application in Java usando Eclipse; nella cartella /report/ sotto WebContent esiste il file rpt.jasper che corrisponde al report che vorrei aprire con il link che dà l'errore descritto. In locale tutto funziona, solo in remoto vedo quell'errore. Ecco la servlet con la quale cerco di aprire il report, servlet che si presume dia tale errore:

    EDIT: Te lo commento meglio e te lo rendo un pò più leggibile.


    codice:
    package servletReport;
    
    //qui ci sono un pò di import per le necessarie risorse
    import java.io.IOException;
    import java.io.OutputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JRExporterParameter;
    import net.sf.jasperreports.engine.JasperFillManager;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.engine.export.JRRtfExporter;
    
    /**
     * Servlet implementation class for Servlet: ServletReportStremRTF
     *
     */
     public class ServletReportStreamRTF extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
       static final long serialVersionUID = 1L;
       
        /* (non-Java-doc)
    	 * @see javax.servlet.http.HttpServlet#HttpServlet()
    	 */
    	public ServletReportStreamRTF() {
    		super();
    	}   	
    	
    	/* (non-Java-doc)
    	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    
    //questa riga di sotto non l'avevo mai vista prima. Ma parla di un warning e non di errori
    	@SuppressWarnings("unchecked")
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    
    //Di seguito troverai i parametri che portano al percorso dove si trova il report
    		String rptFileName = request.getParameter("rptFileName").toString();
    		String rptFolder = "/report/"; 
    		JasperPrint jp = null;
    		
    //qui passo alcuni parametri per il report, in locale tutto funziona bene. 
    		Map parameters = new HashMap();
    		parameters.put("param1", new Integer(1));
    		parameters.put("alfa", "www");
    		parameters.put("beta", "CCC");
    		
    //qui ci sono i parametri per la connessione
    		String cnHost = "localhost";
    		String cnName = "databasedb";
    		String cnLogin = "databaseuser";
    		String cnPsw = "databasepsw";
    		Connection Conn = null; 
    		
    		ServletContext context = this.getServletContext();
    		
    //Parte relativa alla connessione al db
    		try {
    			Class.forName("org.postgresql.Driver").newInstance();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		try {
    			Conn = DriverManager.getConnection("jdbc:postgresql://"+cnHost+"/" + cnName + "?user=" + cnLogin + "&password=" + cnPsw);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    //Ecco la parte secondo me incriminata! 
    C'è qualcosa, nel modo di ottenere il percorso del report 
    tramite context.getRealPath (ti ricordo che il report è sotto WebContent/report/)
     che in locale funziona ed in remoto no. 
    Posso sbagliarmi, ma forse doveva esserci qualcosa che non ho fatto. 
    
    		try {
    			jp = JasperFillManager.fillReport(context.getRealPath(rptFolder + rptFileName + ".jasper"), parameters, Conn);
    		} catch (JRException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    //Parte relativa all'apertura del report
    		JRRtfExporter exporter = new JRRtfExporter();          
            response.setHeader("Content-disposition", "attachment; filename=" + rptFolder + rptFileName + ".rtf");
            response.setContentType("application/x-download");          
            OutputStream outputStream = response.getOutputStream();          
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
            
            try {
    			exporter.exportReport();
    		} catch (JRException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            
    		outputStream.flush();
            outputStream.close();
    		
    	}  	
    	
    	/* (non-Java-doc)
    	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request,response);
    	}

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    QUASI RISOLTO! Era il percorso che era sbagliato. Mi spiego meglio. Ho estratto il percorso che la servlet usava per cercare il report, facendolo stampare a schermo, ed ecco il risultato:


    codice:
    C:\Users\Admin\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\edilgest\report\test.jasper
    Come si vede chiaramente, nonostante con il mio codice abbia tentato di passargli il percorso della mia applicazione cercando di renderlo indipendente dal mio pc, in relatà si è creato un percorso che include anche il riferimento del mio pc. Bene, come correggere quella servlet in modo da rendere il percorso indipendente dalla macchina ma dipendente solo da files e cartelle dell'applicazione?

    Grazie infinite a tutti.

    EDIT Per ulteriore chiarezza evidenzio di seguito le righe della servlet che restituiscono il percorso, così da risparmiarvi di leggerla per intero, righe che danno il percorso su indicato e che vanno corrette per dare un percorso non dipendente dalla macchina.


    codice:
    ServletContext context = this.getServletContext();
    jp = JasperFillManager.fillReport(context.getRealPath(rptFolder + rptFileName + ".jasper"), parameters, Conn);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.