My requirement: Download a generated pdf report in client side using restApi with jasper report template(.jrxml file)
I am creating reports using jasper report integrate with spring boot. I need to print pdf file for that i created the rest api.The code looks like
@PostMapping("/client-projects")
public void clientProject(@RequestParam String format,@RequestBody List<ProjectReportModel> project,HttpServletResponse response) {
report.clientProjectReport(format,response,project);
}
service class looks like this
public void clientProjectReport(String format,List<ProjectReportModel> project,HttpServletResponseresponse){
InputStream stream = this.getClass().getResourceAsStream("/clientProject.jrxml");
JasperReport report = JasperCompileManager.compileReport(stream);
JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(project);
JasperPrint print = JasperFillManager.fillReport(report, null, source);
if(format.equals("pdf")){
JasperExportManager.exportReportToPdfStream(print, response.getOutputStream());
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "inline; filename=jasper.pdf;");
}
Everything works fine when i run the code in the local but when i deploy the code in server(GCP) i faced the following error
java.lang.IllegalArgumentException: name
at java.base/jdk.internal.loader.URLClassPath$Loader.findResource(URLClassPath.java:600) ~[na:na]
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:291) ~[na:na]
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:655) ~[na:na]
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:653) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
at java.base/java.net.URLClassLoader.findResource(URLClassLoader.java:652) ~[na:na]
at org.springframework.boot.loader.LaunchedURLClassLoader.findResource(LaunchedURLClassLoader.java:100) ~[app.jar:0.0.1-SNAPSHOT]
at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1401) ~[na:na]
at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1048) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
at net.sf.jasperreports.engine.util.JRResourcesUtil.findClassLoaderResource(JRResourcesUtil.java:457) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(DefaultRepositoryService.java:131) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.InputStreamPersistenceService.load(InputStreamPersistenceService.java:51) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.DefaultRepositoryService.getResource(DefaultRepositoryService.java:196) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.RepositoryUtil.findInputStream(RepositoryUtil.java:195) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(RepositoryUtil.java:211) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.renderers.util.RendererUtil.getNonLazyRenderable(RendererUtil.java:179) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:564) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:489) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:383) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:548) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:323) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:256) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:110) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:615) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFiller.java:432) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:162) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:145) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:689) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:1005) ~[jasperreports-6.6.0.jar!/:6.6.0]
at com.yenmin.proton.report.service.ReportService.clientProjectReport(ReportService.java:135) ~[classes!/:0.0.1-SNAPSHOT]
at com.yenmin.proton.report.controller.ReportController.clientProject(ReportController.java:42) ~[classes!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.1.jar!/:5.3.1]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.1.jar!/:5.3.1]
It didn't fill the report ,there it got error don't know why this error occurs we are using docker also while deploying the code in gcp.
If i create a file as tmp file like
File pdfFile = File.createTempFile("jasper", ".pdf");
try(FileOutputStream pos = new FileOutputStream(pdfFile))
{
final JasperReport report = loadTemplate();
JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(project);
System.out.println("Fill report error");
JasperReportsUtils.renderAsPdf(report, null, source, pos);
}
catch (final Exception e)
{
LOG.error(e.getLocalizedMessage(), e);
}
return pdfFile;
}
private JasperReport loadTemplate() throws JRException {
final InputStream reportInputStream = getClass().getResourceAsStream("/clientproject.jrxml");
final JasperDesign jasperDesign = JRXmlLoader.load(reportInputStream);
return JasperCompileManager.compileReport(jasperDesign);
}
everything works but dont know where the files are saved.but file path looks likes "/tmp/client065346395.pdf" i am not clear with how to retrieve the file from tmp folder.
kindly let me know how to resolve this issue or provide me some useful links... Thanks in advance