Ajax + Spring MVC:无法找到目标地址问题排查求助
排查Spring MVC Ajax 404错误的步骤
看起来你的Ajax请求根本没到达控制器方法,结合错误信息里的path":"/$%7Bhome%7D/search/a..."(这里的$%7Bhome%7D是${home}的URL编码),大概率是请求路径未正确解析或匹配导致的。下面一步步来排查解决:
第一步:修正Ajax请求的URL,确保路径合法
你错误里的路径包含未解析的${home},说明你可能直接在JS代码里写了EL表达式,但纯前端文件(比如HTML/独立JS)无法解析EL。如果home是项目上下文路径,正确的做法是先在后端页面(如JSP)里解析好再传给JS:<%-- 在JSP页面中提前解析上下文路径 --%> <script> var basePath = "${pageContext.request.contextPath}"; // 构造正确的Ajax请求URL $.ajax({ url: basePath + "/search/你的具体接口路径", type: "POST", // 必须和控制器方法的请求方法匹配 data: { "参数名": $("#输入框ID").val() }, success: function(result) { // 处理返回结果 }, error: function(xhr) { console.log(xhr.responseText); } }); </script>同时打开浏览器开发者工具(F12)的Network标签,查看实际发送的请求URL,确认它和控制器的映射路径完全一致。
第二步:检查控制器的映射配置是否正确
确保控制器类和方法的注解没有问题:- 控制器类必须加
@Controller注解,且Spring已经扫描到这个类。比如XML配置里要加<context:component-scan base-package="com.yourpackage.controller"/>,注解配置里用@ComponentScan指定控制器所在包。 - 方法上的
@RequestMapping(或@PostMapping/@GetMapping)路径要和Ajax请求的URL对应。举个例子:@Controller @RequestMapping("/search") public class SearchController { @PostMapping("/getResult") // 完整路径是 /项目上下文/search/getResult @ResponseBody // 必须加这个,否则Spring会试图找视图而非返回JSON public String getSearchResultViaAjax(@RequestParam String keyword) { System.out.println("in getSearchResultViaAjax"); // 业务逻辑处理 return "搜索结果"; } } - 确认请求方法匹配:如果控制器用
@PostMapping,Ajax的type必须是POST;用@GetMapping则对应GET,不匹配可能导致404或405错误。
- 控制器类必须加
第三步:检查Spring MVC核心配置
- 确认
DispatcherServlet的映射路径正确。在web.xml里,DispatcherServlet的映射应设为/,确保所有请求都经过它处理:<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> - 启用注解驱动:XML配置里加
<mvc:annotation-driven/>,注解配置里加@EnableWebMvc,这样Spring才能识别@RequestMapping等注解。
- 确认
第四步:调试验证
修正路径后重新触发请求,查看Network里的请求状态:如果变成200,说明请求已到达控制器,控制台应该会输出你添加的日志。如果还是404,再检查路径拼写、控制器扫描范围、DispatcherServlet配置这些细节。
内容的提问来源于stack exchange,提问作者Anna Klein
相关产品推荐
相关产品推荐

