spring 实现 restful API 遇到一个路径中需要解析数字 ID 导致其他接口路由错误的问题

2021-08-31 13:36:50 +08:00
 shadowfish0

比如我有一个接口 /news/{id}

这个 ID 是 int,我直接在方法体中用了 Integer 类型,同时配置了如果类型转换失败就统一进参数错误处理,返回 400 (这里是因为其他不使用 path 变量的校验中也要用到这个)

但是问题来了,如果这个 id 不是 int

/news/ssss

它并不会返回应有的 404 错误,而是直接进了参数处理过程返回 400

这就不对了,想问问应该如何解决这个问题

855 次点击
所在节点    问与答
10 条回复
hhyyd
2021-08-31 14:45:41 +08:00
我觉得没什么问题.

springmvc 在匹配的时候,先匹配确定的 url, 如果没有那就去匹配 带通配符的 /news/{id}.

因为 url 是 string 所以确实匹配到了 /news/ssss=>/news/{id}. 没有 404 NotFound, 它确实找到了 url.

然后在类型转换的时候 400 错误了.
zxCoder
2021-08-31 14:45:46 +08:00
"应有的 404 错误",好像要说 400 也没什么不对吧
hhyyd
2021-08-31 15:03:40 +08:00
如果想让这个匹配不到,我的思路是:

自定义 HandlerMapping 在匹配到 HandlerMethod 之后, 尝试一次参数的类型匹配?转换?, 如果匹配失败, 直接让这个 url 匹配不到从而走 noHandlerFound 的逻辑抛 404

不知道是否可行?
qinxi
2021-08-31 15:50:44 +08:00
return ResponseEntity.notFound()
Vegetable
2021-08-31 15:53:51 +08:00
这不就是类型转换失败嘛?不然你那个转换失败处理的是啥?
Vegetable
2021-08-31 15:59:23 +08:00
Kilerd
2021-08-31 16:14:32 +08:00
@GetMapping("/news/{id:[0-9]+})
aragakiyuii
2021-08-31 16:19:57 +08:00
我觉得是接口设计问题,看看 AntPathMatcher 这个类
shadowfish0
2021-09-02 12:04:18 +08:00
@Kilerd 感谢,这种方法完美解决
shadowfish0
2021-09-02 12:05:51 +08:00
@hhyyd 感谢回复,楼下的正则方式感觉更加简单,直接通过让 url 匹配不到的方式解决这个问题嘿。但还是感谢大佬回复!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX