使用@RequestBody接收JSON参数的Spring接口如何实现页面跳转?
问题根因与解决方案
核心原因
你遇到的无法跳转的问题和@RequestBody没有直接关系,核心是两个底层逻辑限制:
- 你用了
@RestController注解修饰控制器类,该注解等价于@Controller + @ResponseBody组合,所有接口方法的返回值都会直接作为响应体返回,不会走Spring MVC的视图解析器,自然无法触发页面跳转 - 前端发起的是Ajax异步请求,就算后端返回跳转指令,浏览器默认只会接收响应内容,不会主动触发当前页面的跳转动作
最优解决方案(无需移除@RequestBody,改动量最小)
不需要修改现有的参数接收逻辑,只要调整返回结构,在前端Ajax回调中手动触发跳转即可:
后端接口调整
将接口返回值改为携带跳转地址的JSON结构:
@PostMapping("/saveMovBienes2") public Map<String, Object> saveMovBienes2(@RequestBody Request myRequest) { // 保留原有业务处理逻辑 Map<String, Object> resp = new HashMap<>(); resp.put("status", "success"); // 替换为你实际需要跳转的页面路径 resp.put("redirectPath", "${pageContext.request.contextPath}/目标页面路径"); return resp; }
前端Ajax请求调整
补充success回调逻辑,拿到后端返回的跳转地址后手动跳转:
$.ajax({ type:'POST', url:'${pageContext.request.contextPath}/saveMovBienes2', data: JSON.stringify({ dni:dni, table:table, tipoMov:tipoMov}), dataType: "json", contentType: 'application/json', success: function(res) { if(res.status === 'success') { window.location.href = res.redirectPath; } } })
误区澄清
网上说的「移除@RequestBody就能跳转」的方案,适用场景是普通表单同步提交+普通@Controller修饰的接口,和你当前Ajax提交JSON的场景完全不匹配,不需要为了跳转修改原有参数接收逻辑。
内容的提问来源于stack exchange,提问作者Juano Cataldo
相关产品推荐
相关产品推荐

