V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shadowfish0
V2EX  ›  问与答

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

  •  
  •   shadowfish0 · 51 天前 · 395 次点击
    这是一个创建于 51 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    /news/ssss

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

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

    10 条回复    2021-09-02 12:05:51 +08:00
    hhyyd
        1
    hhyyd   51 天前
    我觉得没什么问题.

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

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

    然后在类型转换的时候 400 错误了.
    zxCoder
        2
    zxCoder   51 天前
    "应有的 404 错误",好像要说 400 也没什么不对吧
    hhyyd
        3
    hhyyd   51 天前
    如果想让这个匹配不到,我的思路是:

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

    不知道是否可行?
    qinxi
        4
    qinxi   51 天前
    return ResponseEntity.notFound()
    Vegetable
        5
    Vegetable   51 天前
    这不就是类型转换失败嘛?不然你那个转换失败处理的是啥?
    Kilerd
        7
    Kilerd   51 天前   ❤️ 4
    @GetMapping("/news/{id:[0-9]+})
    aragakiyuii
        8
    aragakiyuii   51 天前
    我觉得是接口设计问题,看看 AntPathMatcher 这个类
    shadowfish0
        9
    shadowfish0   49 天前
    @Kilerd 感谢,这种方法完美解决
    shadowfish0
        10
    shadowfish0   49 天前
    @hhyyd 感谢回复,楼下的正则方式感觉更加简单,直接通过让 url 匹配不到的方式解决这个问题嘿。但还是感谢大佬回复!
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1386 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:34 · PVG 01:34 · LAX 10:34 · JFK 13:34
    ♥ Do have faith in what you're doing.