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/jsonAccept: application/json
内容的提问来源于stack exchange,提问作者CodingSnowBall
相关产品推荐
相关产品推荐

