Saltar al contenido

¿Cómo usar JasperReports con Spring MVC?

Verificamos de forma exhaustivamente cada noticia en nuestra web con la meta de mostrarte en todo momento la información más veraz y certera.

Solución:

Según mi investigación, encontré los siguientes métodos de uso. Los métodos comienzan con el enfoque más directo (ingenuo) que involucra menos complejidad / configuración inicial y evolucionan para volverse más abstractos pero con más dependencias en Spring / configuración Spring más compleja.

Método 1: use la API JasperReports directamente en el controlador

Simplemente escriba el contenido en el flujo de salida del servlet.

  @RequestMapping(value = "helloReport1", method = RequestMethod.GET)
  @ResponseBody
  public void getRpt1(HttpServletResponse response) throws JRException, IOException 
    InputStream jasperStream = this.getClass().getResourceAsStream("/jasperreports/HelloWorld1.jasper");
    Map params = new HashMap<>();
    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());

    response.setContentType("application/x-pdf");
    response.setHeader("Content-disposition", "inline; filename=helloWorldReport.pdf");

    final OutputStream outStream = response.getOutputStream();
    JasperExportManager.exportReportToPdfStream(jasperPrint, outStream);
  

Método 2: inyectar la vista JasperReportPdf en el controlador

Dado el bean JasperReportsPdfView:

@Bean @Qualifier("helloWorldReport2")
public JasperReportsPdfView getHelloWorldReport() 
  JasperReportsPdfView v = new JasperReportsPdfView();
  v.setUrl("classpath:jasperreports/HelloWorld2.jasper");
  v.setReportDataKey("datasource");
  return v;

Esta vista se puede inyectar o conectar en el controlador para su uso:

@Autowired @Qualifier("helloWorldReport2")
private JasperReportsPdfView helloReport;

@RequestMapping(value = "helloReport2", method = RequestMethod.GET)
public ModelAndView getRpt2(ModelAndView modelAndView) 
  Map parameterMap = new HashMap<>();
  parameterMap.put("datasource", new JREmptyDataSource());
  modelAndView = new ModelAndView(helloReport, parameterMap);
  return modelAndView;

Tenga en cuenta que el uso de JasperReportsPdfView (o el más versátil JasperReportsMultiFormatView) requiere una dependencia de spring-context-support:


  org.springframework
  spring-context-support
  4.1.3


Método 3: utilice el solucionador de vistas XML o ResourceBundle para asignar nombres de vistas lógicas a vistas de JasperReport

Configure un nuevo solucionador de vistas, en este caso el ResourceBundleViewResolver para correr ante el InternalResourceViewResolver. Esto se basa en los valores de orden que se establecen (0 ocurre antes de 1):

@Bean
public ResourceBundleViewResolver getResourceBundleViewResolver() 
  ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();
  resolver.setBasename("jasperreport-views");
  resolver.setOrder(0);
  return resolver;


@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() 
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setPrefix("/WEB-INF/views/");
  resolver.setSuffix(".jsp");
  resolver.setOrder(1);
  return resolver;

Luego, en la raíz de nuestro classpath, el jasperreport-views.properties El archivo puede contener el nombre de la vista lógica emparejado con la clase y los valores de propiedad (es decir, url y reportDataKey) pertinentes para reproducir un JasperReport:

helloReport3.(class)=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView
helloReport3.url=classpath:/jasperreports/HelloWorld3.jasper
helloReport3.reportDataKey=myDataSourceKey

El código del controlador se ve así:

@RequestMapping(value = "helloReport3", method = RequestMethod.GET)
public ModelAndView getRpt3(ModelMap modelMap, ModelAndView modelAndView) 
  modelMap.put("myDataSourceKey", new JREmptyDataSource());
  return new ModelAndView("helloReport3", modelMap);

Me gusta este enfoque. Los controladores permanecen “tontos” y solo se ocupan de los valores de cadena, y la asignación de nombres a las vistas puede suceder todo en una ubicación.


Método 4: use JasperReportsViewResolver

Configurar un orden cero JasperReportViewResolver y el truco es usar setViewNames para decirle a Spring qué nombres de vista lógica desea que maneje este solucionador (de lo contrario, terminará con “No se pudo cargar el informe de JasperReports desde el recurso de la ruta de clases [jasperreports/index.jasper]”errores de tipo):

@Bean
public JasperReportsViewResolver getJasperReportsViewResolver() 
  JasperReportsViewResolver resolver = new JasperReportsViewResolver();
  resolver.setPrefix("classpath:/jasperreports/");
  resolver.setSuffix(".jasper");
  resolver.setReportDataKey("datasource");
  resolver.setViewNames("rpt_*");
  resolver.setViewClass(JasperReportsMultiFormatView.class);
  resolver.setOrder(0);
  return resolver;
  

@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() 
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setPrefix("/WEB-INF/views/");
  resolver.setSuffix(".jsp");
  resolver.setOrder(1);
  return resolver;

Y dentro del controlador:

@RequestMapping(value = "helloReport4", method = RequestMethod.GET)
public ModelAndView getRpt4(ModelMap modelMap, ModelAndView modelAndView) 
  modelMap.put("datasource", getWidgets());
  modelMap.put("format", "pdf");
  modelAndView = new ModelAndView("rpt_HelloWorld", modelMap);
  return modelAndView;

Este es mi enfoque preferido. Los controladores resuelven los informes jasper de una manera muy similar a cómo se resuelven las vistas jsp usando el InternalResourceViewResolver y, por lo tanto, no hay necesidad de un archivo de mapeo explícito como con el enfoque de archivo xml o de propiedades en el método n. ° 3 anterior.

EDITAR

Los javadocs para JasperReportsPdfView mencionar que usa el obsoleto JRExporter API. ¿Existe una vista JasperReports mejor (más nueva) para usar? Quizás optando por el JasperReportsMultiFormatView es una mejor opción ya que no parece utilizar JRExporter.

Recuerda que te damos el privilegio agregar una reseña .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *