2011-03-21 76 views
12

Tengo una aplicación web y el cliente ha solicitado ver algunos informes. El enfoque ha sido utilizar iReport y mostrarles el informe en pantalla.Uso de JasperReports con una ruta relativa

I have already asked something like this. Pero hoy he descubierto que las rutas a los archivos de informe (jrxml) son absolutas. Entonces tengo que cambiar el programa para que acepte rutas relativas. He intentado hacer esto, pero parece que ni el jrxml ni los archivos compilados (.jasper) aceptan rutas relativas para no compilar ni para llenar el informe.

Esto es lo que he llegado hasta aquí:

//path is generated as request.getContextPath() + "/jrxmlFiles/" 
public void generateReport(HttpServletResponse res, ConexionAdmin con, String path) throws Exception{ 

    ServletOutputStream out = null; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    JasperDesign jasperDesign = JRXmlLoader.load(path); 
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 

    byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, pars, con.initConexion()); 
     res.setContentType("application/pdf"); 
    res.setContentLength(bytes.length); 
    out = res.getOutputStream(); 
    out.write(bytes, 0, bytes.length); 

    res.setHeader("Cache-Control", "cache"); 
    res.setHeader("Content-Disposition", "attachment; filename=report.pdf"); 
    res.setHeader("Pragma", "cache"); 
    res.setContentLength(bos.size()); 

    out.write(bos.toByteArray()); 
    out.flush(); 
    bos.close(); 
    out.close(); 
    res.flushBuffer(); 
} 

Esto parece funcionar con rutas absolutas, pero me lanza:

Exception Message 
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException 

cuando se cambia a una ruta relativa. He buscado en la red sin éxito en cómo cambiar a mis ajustes.

Tengo el javaDoc para la API jasper, pero prefiero no leerlo si puedo evitarlo.

+0

Parece que he olvidado agregar la declaración de pars, es solo un nuevo HasMap() (ya que el informe que intento no tiene variables). Perdón por el error! – Random

Respuesta

16
  • Las rutas deben ser absolutas.
  • Sólo compilar .jrxml archivos a .jasper archivos si el .jrxml se está modificando. Por lo general, solo puede cargar el archivo .jasper y omitir la compilación por completo. Es mucho mas rapido
  • Tienda .jasper y .jrxml archivos fuera de su raíz web.
  • crear los siguientes parámetros a través de todas sus informes: artículos
     
        ROOT_DIR = "/full/path/to/reports/" 
        IMAGE_DIR = $P{ROOT_DIR} + "images/" 
        STYLES_DIR = $P{ROOT_DIR} + "styles/" 
        SUBREPORT_DIR = $P{ROOT_DIR} + "subreports/" 
        COMMON_DIR = $P{ROOT_DIR} + "common/"
  • referencia relativa a $P{ROOT_DIR} (por ejemplo, $P{IMAGE_DIR} se define en términos de $P{ROOT_DIR}).
  • Pase el valor de $P{ROOT_DIR} desde su entorno.
  • Vincular su aplicación a cualquier marco de trabajo de informes que use.

Luego use las expresiones cuando sea necesario. Por ejemplo, subinformes referencia como sigue:

<subreportExpression> 
    <![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]> 
</subreportExpression> 

Esto permitirá que el directorio subinforme para variar entre entornos.

+1

@Random: No estoy sugiriendo que no use JasperReports. Lejos de ahi. Sugiero que uses una implementación que use JasperReports sin estar estrechamente unida. (Aislamiento eficaz de componentes arquitectónicos.) –

2

Tuve el mismo problema y obtuve la solución. Primero, coloque todos los objetos (subinforme, imagen, etc.) utilizados en el informe y todas las extensiones (.jasper, .jrxml) en una carpeta y colóquela en C: // disco. Probablemente ahora esté ubicado en algún lugar de Mis documentos, o en cualquier ruta que tenga espacios entre palabras, y luego iReport lo ve como "Mis% 20Documentos" y lo confunde.

Por lo tanto, coloque la carpeta en C: //, ponga todo lo relacionado con su informe en la misma carpeta y ponga rutas relativas a todo. Esto debería funcionar. Espero haber ayudado a alguien.

+0

Este proyecto fue desde hace bastante tiempo, y ya no tengo el código para probarlo. Pero la idea era que Jasper podría usar alguna ruta relativa como /JRXML_files/account/account_report.jrxml (dentro de WebContent). Aunque en el momento en que esto se publicó, Jasper tiene una nueva versión y es de esperar que acepten esta ruta. Gracias y espero poder probar esto pronto. – Random

+1

Sí, entiendo cuál fue su problema. Y tuve el mismo problema hace unos días con iReport 3.7.2, y finalmente obtuve lo que lo confundió. En cualquier caso, solo quería publicar una respuesta en alguna parte, ya que vi muchas preguntas con el mismo problema. – Merjem