Spring Controller POST接口接收可选参数JSON时出现404问题
解决Spring Boot POST接口接收部分字段JSON时404的问题
首先得明确:404错误的核心是请求路径没匹配到任何控制器方法,咱们先从最基础的路径匹配问题排查,再逐步验证其他潜在因素:
1. 先确认端口与请求路径完全匹配
你的curl请求用的是http://localhost:4569/rest/publish/post,请先核对Spring Boot应用的配置:
- 检查
application.properties或application.yml里的server.port是不是确实设为4569,端口不匹配直接会导致404。 - 如果配置了
server.servlet.context-path(比如/myapp),那请求路径得改成http://localhost:4569/myapp/rest/publish/post,别漏掉上下文路径。
2. 验证控制器的映射是否生效
虽然你的控制器代码看起来没问题,但可以通过日志确认:
- 启动应用后,查看控制台输出,Spring Boot会打印所有已映射的接口信息,比如类似这样的日志:
确认这条日志存在,且路径、请求方法、o.s.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping : Mapped "{[/rest/publish/post],methods=[POST],consumes=[application/json]}" onto public java.lang.String com.example.demo.SocialController.publish(com.example.demo.Post)consumes类型和你的请求完全匹配。 - 尝试用全字段的JSON请求测试,如果全字段请求能正常返回,说明路径是对的,那部分字段请求的404大概率是请求时的拼写错误(比如把
owner写成ownr,或者路径输错)。
3. 确保JSON反序列化兼容部分字段
虽然404不是反序列化问题,但咱们可以给Post类加个兜底配置,避免因未知字段导致意外问题:
在Post类上添加@JsonIgnoreProperties(ignoreUnknown = true),这样即使请求里有类中未定义的字段,也不会触发反序列化失败:
@JsonIgnoreProperties(ignoreUnknown = true) public class Post { // 原属性、内部类及getter/setter保持不变 }
另外你的Post类结构是正确的:内部类Text是静态的(Jackson必须用静态内部类才能解析嵌套对象),且所有属性都有getter/setter,这部分没问题。
4. 换工具验证排除curl语法问题
如果curl请求还是有问题,可以用Postman或者IntelliJ的HTTP Client工具重新构造请求,排除curl命令的语法错误:
比如IntelliJ的HTTP请求示例:
POST http://localhost:4569/rest/publish/post Content-Type: application/json { "owner": "Owner of the Company", "text": { "text": "Png new image" } }
总结
优先排查端口、路径拼写、上下文路径这几个最容易引发404的点,因为反序列化失败只会返回400 Bad Request,不会出现404。如果全字段请求正常,部分字段请求404,那肯定是请求时的路径或字段拼写有误,仔细核对就能解决。
内容的提问来源于stack exchange,提问作者kaushik
相关产品推荐
相关产品推荐

