SpringMVC在处理Ajax请求后返回void导致前台Ajax回调函数不执行
问题简述
在一次SpringMVC项目中,前台通过Ajax请求,准备修改数据库中的数据。因为Ajax请求只是让后台更改数据,所以Controller方法根本不需要返回给前台任何数据,所以我们将Controller的方法的返回值设置为void。但令我困扰的是,前端页面本应该执行的回调函数一直不执行。
打开控制态发现报404错误。我又通过debug发现该请求是可以进入Controller方法的,让我很不解的是为什么我已经进入Controller的方法中并处理完成了,但居然报404错,如下图:
解决方案
我们需要在返回值前面加上一个@ResponseBody注解,因为即使方法返回值为void,spring也会按照前台请求过来的页面地址去找,找不到就会报上图的404错误。
@RequestMapping("/customer/update.action")
public @ResponseBody void updateAjax(Customer customer){
customerService.update(customer);
}
也就是说,我们对于接受Ajax请求的Controller方法,不管是否需要返回数据,都需要在返回值前面加上@ResponseBody注解,或者说通过Response手动回写一段数据,例如:“OK”。也可以解决上面的问题。
@RequestMapping("/customer/update.action")
public void updateAjax(HttpServletResponse response,Customer customer) throws IOException{
customerService.update(customer);
response.getWriter().write("ok");
}
至于这么做的底层原理需要分析SpringMVC的源代码。