首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >被这个老代码骗了,还需要再重新发次版,烦

被这个老代码骗了,还需要再重新发次版,烦

作者头像
烟雨平生
发布2025-05-08 15:56:50
发布2025-05-08 15:56:50
12400
代码可运行
举报
文章被收录于专栏:数字化之路数字化之路
运行总次数:0
代码可运行

各位看官先看看这段代码要使不:

GET请求时生效 or POST请求时生效,or Both?

背景

增加了一个新支付渠道:企业网银。

这个渠道有个特点:支付时,会跳转到一个新页面。

那么支付成功后,是不是要跑回自家网站的支付成功页?

是的。不然,不闭环。

看字段与老接口一致,就没有直接复用了本文开头的这段。

你看GET、POST都支付。

然而,报错了!

错哪了?

错哪了?

关键日志对这次排查很有帮助。 以这个场景为例,日志中包含了,处理的sku数有多少,每次处理了哪些sku,下架一个sku时的环境信息。 总结一下,一个好的日志一般是这样的:什么时候处理哪个对象,处理的结果是什么,处理的原因是什么。 唐成,公众号:的数字化之路下架超过8折商品这样的小改动,居然翻车了,你敢信!!!

查日志:

代码语言:javascript
代码运行次数:0
运行
复制
异常处理,org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported

不是有吗?

代码语言:javascript
代码运行次数:0
运行
复制
@PostMapping("/FrontRcvResponse/post")
@GetMapping("/FrontRcvResponse/post")

难道有问题?

万事不决问DeepSeek。

在Spring框架中,一个方法不能同时用@PostMapping@GetMapping注解同一个路径。你的写法会导致以下问题:


1. 代码的直接问题

代码语言:javascript
代码运行次数:0
运行
复制
@PostMapping("/FrontRcvResponse/post")
@GetMapping("/FrontRcvResponse/post")
public void frontRcvResponseDoPost(...)
{
 ...
}

这是非法的,会直接引发 Ambiguous mapping(映射冲突) 错误。 Spring 启动时会检查控制器映射,发现同一个路径(/FrontRcvResponse/post)绑定了两个不同的 HTTP 方法(GET 和 POST),但指向同一个方法,这会直接导致应用启动失败


2. 为什么会报错?

  • @PostMapping 等价于 @RequestMapping(method = RequestMethod.POST)
  • @GetMapping 等价于 @RequestMapping(method = RequestMethod.GET)
  • 如果同一个路径同时绑定了 GET 和 POST 方法,且指向同一个方法,Spring 无法确定如何路由请求,会抛出类似以下错误:
代码语言:javascript
代码运行次数:0
运行
复制
java.lang.IllegalStateException: Ambiguous mapping.
Cannot map 'xxxController' method ...

大模型也有胡说八道的时候。明明项目是可以正常启动了。 不过,这段代码可能真有问题。之前印象是这样写的

代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping(value = "/FrontRcvResponse/post", method = {RequestMethod.POST, RequestMethod.GET})

怎么改?

先复现。

日志中是有WARN的

代码语言:javascript
代码运行次数:0
运行
复制
2025-05-07T20:09:42.987+08:00  WARN 61667 --- [spring-ai-chat] [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Multiple @RequestMapping annotations found on public void net.aias.springaichat.adapter.openapi.TestMappingController.frontRcvResponseDoPost(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) throws java.io.IOException, but only the first will be used: [@org.springframework.web.bind.annotation.PostMapping(consumes={}, headers={}, name="", params={}, path={"/FrontRcvResponse/post"}, produces={}, value={"/FrontRcvResponse/post"}), @org.springframework.web.bind.annotation.GetMapping(consumes={}, headers={}, name="", params={}, path={"/FrontRcvResponse/post"}, produces={}, value={"/FrontRcvResponse/post"})]

POST方法调用是OK的。

GET会报错:

如何让GET的不报错?把GetMapping方法放最上面就可以了。

结论:

用@GetMapping和@PostMapping作用于一个API时,写在最上面的生效。

怎么改呢?

如果要想两个都生效,需要使用

代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping(value = "/FrontRcvResponse/post/both", method = {RequestMethod.GET, RequestMethod.POST})

看下效果:

结论

一个API上使用多个PostMapping, PutMapping, DeleteMapping, PatchMapping时,写在最上面的生效。

如果想让一个接口同时支持多个HttpMethod的请求,需要使用

代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping(value = "resources/operate/multi", 
method = {RequestMethod.GET, RequestMethod.POST})
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 错哪了?
    • 1. 代码的直接问题
    • 2. 为什么会报错?
  • 怎么改?
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档