Spring MVC Maven项目Ajax请求报错:无Tomcat日志,浏览器显示400
搞定Spring MVC Ajax GET请求返回400 Bad Request的问题
兄弟,你的问题其实出在GET请求的参数传递方式上,我给你拆解下原因和解决方案:
首先看你写的Ajax代码,用了GET请求,但同时做了两个不符合GET规范的操作:
- 把参数用
JSON.stringify(data)转成JSON字符串传给data - 设置了
contentType : "application/json"
GET请求的参数是通过URL后面的查询字符串传递的,不是放在请求体里,而且Spring MVC默认不会去URL里解析JSON格式的参数,这直接导致服务器看不懂你的请求,返回400错误。而且GET请求设置contentType为application/json本身就不符合HTTP的使用习惯,服务器自然处理不了。
下面给你两个可行的修复方案,选一个适合你的:
方案一:改成POST请求(更推荐,传JSON数据用POST更合理)
把请求类型换成POST,后端也对应改成POST映射,这样就能正常接收JSON参数了:
前端修改后的代码:
var data = { "topic" : $("#topic").val()}; $.ajax({ type : "POST", contentType : "application/json", url : "./saveSyllabus", data : JSON.stringify(data), dataType : 'json', timeout : 100000, success : function(data) { console.log("SUCCESS: ", data); alert("Record Added Successfully!!") }, error : function(e) { console.log("ERROR: ", e); alert("Error Occured!!") } });
后端控制器调整:
确保你的控制器方法用@PostMapping,并且用@RequestBody注解来接收JSON参数:
@PostMapping("/saveSyllabus") @ResponseBody public ResponseEntity<?> saveSyllabus(@RequestBody TopicDto topicDto) { // 这里写你的业务逻辑,比如保存数据 return ResponseEntity.ok("保存成功"); }
这里的TopicDto是你自己定义的实体类,要包含topic字段,并且要有对应的getter和setter方法,Spring才能正确把JSON转成对象。
方案二:坚持用GET请求,调整参数传递方式
如果一定要用GET,那别传JSON了,直接传普通的键值对,同时去掉contentType的设置:
前端修改后的代码:
var data = { "topic" : $("#topic").val()}; $.ajax({ type : "GET", url : "./saveSyllabus", data : data, // jQuery会自动把这个对象转成?topic=xxx的查询字符串 dataType : 'json', timeout : 100000, success : function(data) { console.log("SUCCESS: ", data); alert("Record Added Successfully!!") }, error : function(e) { console.log("ERROR: ", e); alert("Error Occured!!") } });
后端控制器调整:
用@GetMapping,可以直接用@RequestParam接收单个参数,或者用实体类自动绑定:
// 方式一:单个参数接收 @GetMapping("/saveSyllabus") @ResponseBody public ResponseEntity<?> saveSyllabus(@RequestParam("topic") String topic) { // 业务逻辑 return ResponseEntity.ok("保存成功"); } // 方式二:实体类接收(如果以后参数多了更方便) @GetMapping("/saveSyllabus") @ResponseBody public ResponseEntity<?> saveSyllabus(TopicDto topicDto) { // 业务逻辑 return ResponseEntity.ok("保存成功"); }
额外排查小技巧
如果改完还是有问题,可以检查这几点:
- 确认前端的
./saveSyllabus路径和后端的映射路径完全匹配,注意相对路径的问题(比如当前页面的URL会不会导致路径错误) - 实体类的字段名
topic要和前端传的参数名完全一致,大小写敏感哦 - 开启Spring的DEBUG日志,比如在
application.properties里加logging.level.org.springframework.web=DEBUG,这样能看到请求参数解析的详细过程,更容易找到问题
另外,关于没有Tomcat错误日志的问题,400属于客户端请求格式错误,服务器通常不会生成错误日志,开启Spring的DEBUG日志就能看到更多细节啦。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

