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 .