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

Spring Boot中RouterFunction下POST/PUT请求404问题求助

问题原因及解决办法

核心原因:请求谓词匹配错误

你定义的ACCEPT_JSON = accept(MediaType.APPLICATION_JSON)是用来校验请求头中的Accept字段(表示客户端期望接收的响应格式),而不是校验请求体格式的Content-Type字段。你在Postman中仅设置了Content-Type: application/json,但没有设置Accept: application/json,导致POST/PUT请求无法匹配路由中定义的谓词规则,最终返回404。

另外从报错信息的path: /user/1来看,如果你是在测试POST请求时用了这个路径,也会直接404——因为你的POST路由定义的是/user,而非带id的/user/{id}。

解决步骤

1. 修正请求谓词(推荐)

如果你的需求是校验请求体为JSON格式,应该使用contentType(MediaType.APPLICATION_JSON)替代accept(...)。修改WebFunctionConfig:

@Configuration
public class WebFunctionConfig {
    // 改为校验请求体格式为JSON
    private static final RequestPredicate CONTENT_TYPE_JSON = contentType(MediaType.APPLICATION_JSON);
    @Bean
    public RouterFunction<ServerResponse> userRoute(UserBizHandler userHandler){
        return RouterFunctions.route()
                .GET("/user/{id}", accept(MediaType.ALL),userHandler::getUser)
                .GET("/users",userHandler::getUsers)
                // 使用CONTENT_TYPE_JSON替代原ACCEPT_JSON
                .POST("/user", CONTENT_TYPE_JSON,userHandler::addUser)
                .PUT("/user/{id}", CONTENT_TYPE_JSON,userHandler::updateUser)
                .DELETE("/user/{id}",userHandler::deleteUser)
                .build();
    }
}

2. 确保请求路径正确

  • 测试POST请求时,使用路径/user(不要带id)
  • 测试PUT请求时,使用路径/user/{id}(例如/user/1)

3. (可选)同时校验Accept和Content-Type

如果需要同时要求客户端接受JSON响应、且请求体是JSON,可以组合两个谓词:

.POST("/user", contentType(MediaType.APPLICATION_JSON).and(accept(MediaType.APPLICATION_JSON)), userHandler::addUser)

此时需要在Postman的Headers中同时设置:

  • Content-Type: application/json
  • Accept: application/json

内容的提问来源于stack exchange,提问作者CodingSnowBall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:11:16