Java版本迁移后Ajax请求路径错误,无法到达Spring Controller
解决Ajax请求无法到达Controller,转而查找JSP文件的问题
根据你的报错信息和代码,核心问题是请求未匹配到@Controller的方法,Spring MVC转而尝试用视图解析器渲染JSP视图,以下是具体排查和修复步骤:
1. 修复Ajax请求的参数冲突
你的Ajax代码中重复设置了contentType,且未正确构建multipart/form-data请求体,导致请求格式异常,无法被Spring MVC解析:
// 正确构建FormData请求体 var formData = new FormData(); formData.append("file1", document.getElementById("fileInput").files[0]); // 对应Controller的MultipartFile参数 formData.append("paramKey", "paramValue"); // 添加其他参数 $.ajax({ url: "${pageContext.request.contextPath}/fir_dir/sec_dir/test1.dd", // 加上项目上下文路径,避免绝对路径错误 type: "POST", data: formData, enctype: 'multipart/form-data', processData: false, contentType: false, // 由浏览器自动设置multipart请求头 cache: false, dataType: "text", success:function(response){ // 处理响应 }, error:function(xhr){ console.log(xhr.responseText); } })
2. 确保Controller映射和注解生效
调整请求映射的准确性
- 显式指定请求方法,避免路径匹配歧义
- 为
MultipartFile显式指定参数名,确保参数绑定成功 - 确保
servlet.xml中配置了<mvc:annotation-driven/>,否则@ResponseBody不会生效
@Controller @RequestMapping("/fir_dir/sec_dir") // 移除末尾斜杠,避免路径匹配冗余 public class ItemInsertController { @RequestMapping(value = "test1.dd", method = RequestMethod.POST) @ResponseBody public ModelMap itemExcelUploadDataView(HttpServletRequest request, @RequestParam Map<String, Object> param, @RequestParam("file1") MultipartFile file1, // 显式绑定参数名 ModelMap modelMap) throws Exception{ // 业务逻辑代码 return modelMap; } }
3. 配置Multipart文件上传解析器
因为请求是multipart/form-data类型,必须在servlet.xml中配置文件上传解析器,否则Spring无法解析请求,导致无法匹配Controller方法:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 限制上传文件大小为10MB --> <property name="defaultEncoding" value="UTF-8"/> </property>
同时需要引入Maven依赖(如果未引入):
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
4. 检查DispatcherServlet的URL映射
确保web.xml中DispatcherServlet的url-pattern能匹配你的请求后缀(.dd):
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.dd</url-pattern> <!-- 确保匹配请求后缀 --> </servlet-mapping>
5. 排查SiteMesh过滤器影响
从报错日志看,请求经过了SiteMeshFilter,该过滤器可能会修改请求路径或转发请求,导致DispatcherServlet无法正确处理。可以暂时禁用该过滤器测试,若问题解决,调整SiteMesh配置,排除你的Ajax请求路径。
内容的提问来源于stack exchange,提问作者King Henry
相关产品推荐
相关产品推荐

