Spring 5.3.9升级后AbstractPDF控制器调用出现SRVE0295E 404错误求助
Spring 5.3.9升级后PDF生成控制器404问题排查
嘿,我来帮你梳理这个升级后遇到的404问题!从你给出的代码和配置来看,核心问题大概率是把PDF视图组件当成控制器来配置映射了,Spring 5.x对组件类型的校验更严格,导致旧的配置逻辑失效。下面给你具体的排查和修复方案:
核心问题分析
你写的IndividualApplicationPdfPublicController继承了AbstractPdfView——这是Spring MVC的视图组件,用来渲染PDF内容的,不是处理请求的控制器。但你却通过SimpleUrlHandlerMapping把它当成控制器来绑定URL,这种写法在旧版本Spring可能能凑合用,但在5.x版本里会因为组件类型不匹配导致映射失效,触发404错误。
修复方案(两种可选)
方案一:保留AbstractPdfView,用视图解析器匹配
这种方式适合想保留原有PDF视图逻辑的场景:
- 添加
BeanNameViewResolver配置,让Spring通过视图名找到对应的PDF视图bean:
<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <!-- 设置优先级,确保比其他视图解析器先生效 --> <beans:property name="order" value="1"/> </beans:bean>
- 移除原来的
publicUrlMapping配置,因为不需要再通过URL绑定视图,而是通过视图名匹配bean id。 - 确认业务控制器返回的
ModelAndView中的视图名individualApplication.pdf.html,和你定义的PDF视图bean的id完全一致——BeanNameViewResolver会自动根据视图名查找同名的View bean并渲染。
方案二:改成注解式控制器(Spring 5.x最佳实践)
这种方式更符合当前注解驱动的开发模式,也更稳定:
- 修改PDF控制器类,改成注解驱动的控制器,不再继承
AbstractPdfView:
@Controller public class IndividualApplicationPdfPublicController { @GetMapping("/public/individualApplication.pdf.html") public void generatePdf(@RequestParam Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { // 设置响应头,告诉浏览器返回的是PDF文件 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "inline; filename=individualApplication.pdf"); // 初始化PDF文档和Writer Document document = new Document(); PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream()); // 这里复制你原来在buildPdfDocument里的PDF内容构建逻辑 document.open(); // 示例:从model取数据并添加到PDF String applicantName = (String) model.get("applicantName"); document.add(new Paragraph("Applicant: " + applicantName)); // 更多PDF内容构建代码... document.close(); pdfWriter.close(); } }
- 确保Spring配置文件启用了注解驱动:
<mvc:annotation-driven/>
- 确认控制器所在的包被Spring扫描到:
<context:component-scan base-package="controller.pdf"/>
- 移除原来的
individualApplication.pdf.htmlbean配置和publicUrlMapping配置,注解已经处理了URL映射。
额外排查点
如果按照上面的方案修复后还是有问题,可以检查这几点:
- DispatcherServlet映射范围:在web.xml(或Java Servlet配置)中,确保DispatcherServlet的
<url-pattern>能覆盖/public/individualApplication.pdf.html,比如用<url-pattern>/</url-pattern>(如果有静态资源,记得加<mvc:default-servlet-handler/>)。 - Bean初始化状态:启动项目时查看日志,确认
IndividualApplicationPdfPublicController已经被成功加载到Spring容器中,没有初始化错误。 - 请求路径正确性:用浏览器开发者工具查看实际请求的URL,确认是否带上了项目的上下文根(比如部署在
/myapp下,实际路径应该是/myapp/public/individualApplication.pdf.html)。
内容的提问来源于stack exchange,提问作者user3067524
相关产品推荐
相关产品推荐

