Spring Boot+Ajax遇Request method 'POST' not supported错误求助
针对你遇到的Request method 'POST' not supported错误,结合给出的代码,从以下几个方向排查解决:
1. 处理Spring Security的CSRF防护
你的Controller使用了@Secured注解,说明项目启用了Spring Security,而Spring Security默认开启CSRF防护,POST请求必须携带CSRF令牌才能通过验证,这是这类问题的常见原因。
解决步骤:
- 在页面的
<head>中添加CSRF令牌的meta标签:
<meta name="_csrf" content="${_csrf.token}"/> <meta name="_csrf_header" content="${_csrf.headerName}"/>
- 在Ajax请求中携带该令牌:
function call_draft() { var draft = { "id": 1, "user_id":5, "lowest_cost_found":3, "paper_used":3, "print_type":3, "actual_ups_per_paper":3, "quantity":3, "color":3, "size":3, "gloss_lam":3, "matt_lam":3, "water_based":3, "uv":3, "varnish":3, "spot_uv":3, "emboss_deboss":3, "hot_stamping":3, "diecut":3, "creasing_line":3, "total_price":3, "markup":3, "final_price":3 }; var token = $("meta[name='_csrf']").attr("content"); var header = $("meta[name='_csrf_header']").attr("content"); $.ajax({ type: "POST", contentType: "application/json", url: "/newdraft", data: JSON.stringify(draft), dataType: 'json', beforeSend: function(xhr) { xhr.setRequestHeader(header, token); }, success: function(data) { alert("success"); console.log(data) }, error: function() { alert("failed"); } }); }
2. 修正Controller方法参数
你的Controller方法中,@RequestBody Draft draft后紧跟BindingResult result,但Spring MVC中,BindingResult无法捕获JSON解析类的错误,反而可能导致请求映射失败。
解决步骤:
如果不需要参数验证,直接移除BindingResult:
@Controller @Secured({"ADMIN","SUPER_ADMIN"}) public class DraftController { @Autowired private DraftService draftService; @PostMapping("/newdraft") public @ResponseBody Draft AddDraft(@RequestBody Draft draft) { draftService.save(draft); return draft; } }
如果需要验证,添加@Valid注解(注意:JSON解析错误仍会直接抛出异常,需配合全局异常处理):
@PostMapping("/newdraft") public @ResponseBody Draft AddDraft(@Valid @RequestBody Draft draft, BindingResult result) { if(result.hasErrors()){ // 此处添加错误处理逻辑 } draftService.save(draft); return draft; }
3. 匹配前后端字段命名
前端JSON使用下划线命名(如user_id),后端Draft类如果是驼峰命名(如userId),需要确保字段映射正确。
解决步骤:
在Draft类的对应字段上添加@JsonProperty注解:
public class Draft { // 其他字段 @JsonProperty("user_id") private Integer userId; // 对应getter/setter方法 }
或者通过全局配置开启下划线转驼峰(Spring Boot项目):
在application.properties中添加:
spring.jackson.property-naming-strategy=SNAKE_CASE
4. 确认请求路径正确性
检查项目是否配置了上下文路径(如server.servlet.context-path=/your-app),如果有,Ajax的URL需要加上上下文路径:
url: "/your-app/newdraft"
5. 检查Jackson依赖
确保项目中引入了Jackson相关依赖(Spring Boot默认包含,手动配置Spring MVC需添加):
<!-- Maven依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者Quan Le Anh

