Spring集成JasperReport访问首页报class path资源不存在错误如何解决
问题根因
你当前ReporteController的@RequestMapping("/{reportName}")会匹配根路径下所有单层路径请求。当你访问http://localhost:8080/时,Spring默认会转发请求到/index.html,这个路径会被该控制器拦截,reportName被赋值为index.html,因此代码会尝试加载不存在的reportes/index.html.jasper文件,触发报错。
解决方案
- 方案1(最推荐):给报表接口新增统一前缀,避免和静态资源路径冲突。将控制器的请求映射调整如下,修改后报表访问地址为
http://localhost:8080/report/ListadoAlumno,完全隔离报表接口和其他资源的路径:
// 修改前 @RequestMapping("/{reportName}") // 修改后 @RequestMapping("/report/{reportName}")
- 方案2:给PathVariable增加正则匹配限制,只匹配符合报表命名规则的路径。如果你的报表名都是纯字母数字,可将请求映射改为以下格式,包含特殊字符(比如
.html中的点)的路径就不会被该控制器拦截,会正常走静态资源处理器加载index.html:
@RequestMapping("/{reportName:[a-zA-Z0-9]+}")
- 额外优化:
ClassPathResource的路径默认统一使用/作为分隔符,不需要用File.separator,避免Windows系统下生成反斜杠导致路径识别错误,直接修改为如下代码即可:
ClassPathResource resource = new ClassPathResource("reportes/" + reportName + ".jasper");
内容的提问来源于stack exchange,提问作者Ronald Valdivia
相关产品推荐
相关产品推荐

