You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:47:00