在对代码进行调试的时候,前端页面报了一个错:
1 {"timestamp":"2019-09-02T02:55:45.555+0000","status":404,"error":"Not Found","message":"No message available”,”path":"/order/createorder"}
这个 bug 出现的原因是因为犯了一个更加低级的错误。。。但是我觉得解决问题的分析思路还是可以借鉴的,这里总结一下。
前端页面显示错误信息,但是在我的后端程序中没有一个报错信息,甚至没有一个异常抛出,而且有关数据成功写入数据库,订单信息写入数据库,商品库存减少,销量增加,一切数据在后端逻辑来说毫无问题,但是前端为什么报错呢?于是我把问题固定在前端的 html 文件上了,回去排查前端代码,打开 chrome 的检查,刷新页面,添加断点,重新刷新,查看变量值:
发现状态 status 确实是 success,变量数据都完全正确,怎么回事,经过一上午的排查,前端貌似没有错。再仔细分析下前端页面报的错,404,not found,”path”:”/order/createorder”,难不成后端的控制层代码有错,导致前端页面响应结果没有找到正确的路径。回去检查一下,果不其然,在控制层方法的注解上面漏了 @ResponseBody 注解。
@ResponseBody
先来看看为什么要添加这个注解
The course documentation states that this annotation serves the function to: ensure that the result will be written to the HTTP response by an HTTP Message Converter (instead of an MVC View).
The annotation means is that the returned value of the method will constitute the body of the HTTP response.
The returned value of the method will constitute the body of the HTTP response.
说的都是一个意思,就是 @ResponseBody 用于对方法进行注释, 表示该方法的返回的结果将直接写入 HTTP 响应正文(Http Response Body)中。我之前控制层代码里有返回值,类型为 CommonReturnType 的通用返回值类型,我把返回值去掉后,方法改为 void,无任何返回值, 虽然在前端的调试中,各种数据依然正常,但是前端页面获取不到控制层方法的返回值,在 response body 中无内容,导致点击前端页面的按钮不会有任何现象发生,虽然此时后端逻辑正确无误,数据库入库操作都实现了。所以我这里必须给该方法一个返回值,且要通过注解形式将返回值加到 Http response body 中。 如果没有这个注解,就会抛出上面的 responseText 异常信息。