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

Spring Boot+Ajax遇Request method 'POST' not supported错误求助

解决POST请求不支持的问题

针对你遇到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:45:42