各位看官先看看这段代码要使不:
GET请求时生效 or POST请求时生效,or Both?
增加了一个新支付渠道:企业网银。
这个渠道有个特点:支付时,会跳转到一个新页面。
那么支付成功后,是不是要跑回自家网站的支付成功页?
是的。不然,不闭环。
看字段与老接口一致,就没有直接复用了本文开头的这段。
你看GET、POST都支付。
然而,报错了!
错哪了?
关键日志对这次排查很有帮助。 以这个场景为例,日志中包含了,处理的sku数有多少,每次处理了哪些sku,下架一个sku时的环境信息。 总结一下,一个好的日志一般是这样的:什么时候处理哪个对象,处理的结果是什么,处理的原因是什么。 唐成,公众号:的数字化之路下架超过8折商品这样的小改动,居然翻车了,你敢信!!!
查日志:
异常处理,org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
不是有吗?
@PostMapping("/FrontRcvResponse/post")
@GetMapping("/FrontRcvResponse/post")
难道有问题?
万事不决问DeepSeek。
在Spring框架中,一个方法不能同时用@PostMapping
和@GetMapping
注解同一个路径。你的写法会导致以下问题:
@PostMapping("/FrontRcvResponse/post")
@GetMapping("/FrontRcvResponse/post")
public void frontRcvResponseDoPost(...)
{
...
}
这是非法的,会直接引发 Ambiguous mapping
(映射冲突) 错误。
Spring 启动时会检查控制器映射,发现同一个路径(/FrontRcvResponse/post
)绑定了两个不同的 HTTP 方法(GET 和 POST),但指向同一个方法,这会直接导致应用启动失败。
@PostMapping
等价于 @RequestMapping(method = RequestMethod.POST)
。@GetMapping
等价于 @RequestMapping(method = RequestMethod.GET)
。java.lang.IllegalStateException: Ambiguous mapping.
Cannot map 'xxxController' method ...
大模型也有胡说八道的时候。明明项目是可以正常启动了。
不过,这段代码可能真有问题。之前印象是这样写的
@RequestMapping(value = "/FrontRcvResponse/post", method = {RequestMethod.POST, RequestMethod.GET})
先复现。
日志中是有WARN的
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时,写在最上面的生效。
怎么改呢?
如果要想两个都生效,需要使用
@RequestMapping(value = "/FrontRcvResponse/post/both", method = {RequestMethod.GET, RequestMethod.POST})
看下效果:
一个API上使用多个PostMapping, PutMapping, DeleteMapping, PatchMapping时,写在最上面的生效。
如果想让一个接口同时支持多个HttpMethod的请求,需要使用
@RequestMapping(value = "resources/operate/multi",
method = {RequestMethod.GET, RequestMethod.POST})