You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:28:12