V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
FormatToday
V2EX  ›  Java

spring boot 请求一个 url 会自动调用另一个的诡异问题

  •  
  •   FormatToday ·
    FormatToday · 2022-08-19 12:14:29 +08:00 · 1977 次点击
    这是一个创建于 588 天前的主题,其中的信息可能已经有所发展或是发生改变。

    image.png

    调用第二个接口的时候为什么会同时调用第一个接口啊,不是前端写的问题,用 postman 调用也是这样。 求大佬指点一下排查的思路

    16 条回复    2022-08-23 15:05:34 +08:00
    wuvvu
        1
    wuvvu  
       2022-08-19 12:20:32 +08:00
    语义重复
    fzdwx
        2
    fzdwx  
       2022-08-19 12:21:39 +08:00
    你 debug 看看`idCode`是啥

    @PathVariable 可能是匹配到了 你加个前缀比如 /getInfo/{idCode}
    yfugibr
        3
    yfugibr  
       2022-08-19 12:34:08 +08:00 via Android
    因为 getRecCompanyLogin 也是一个 string
    ychenenen
        4
    ychenenen  
       2022-08-19 12:34:38 +08:00   ❤️ 1
    {idCode}可以是 getRecCompanyLoginInfo 吧,又都是 get 请求
    yfugibr
        5
    yfugibr  
       2022-08-19 12:39:08 +08:00 via Android
    @yfugibr 就算 idcode 不是 string 应该也会被调用

    接口设计有问题,/aurl 既能匹配 /aurl 也能匹配 /{code}
    我隐约记得这么写编译是会报错的
    willxiang
        6
    willxiang  
       2022-08-19 13:32:34 +08:00
    第一个接口 url 改成 idCode/{idCode}
    nothingistrue
        7
    nothingistrue  
       2022-08-19 13:41:23 +08:00
    /{idCode} 能够匹配任何 /*** 的 URL 。
    lazyfighter
        8
    lazyfighter  
       2022-08-19 13:58:31 +08:00   ❤️ 1
    按照优先级匹配也是第二个接口优先级较高一些, 比较好奇两个接口的执行顺序,
    /**
    * Look up the best-matching handler method for the current request.
    * If multiple matches are found, the best match is selected.
    * @param lookupPath mapping lookup path within the current servlet mapping
    * @param request the current request
    * @return the best-matching handler method, or {@code null} if no match
    * @see #handleMatch(Object, String, HttpServletRequest)
    * @see #handleNoMatch(Set, String, HttpServletRequest)
    */
    @Nullable
    protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {

    比较好奇楼主用的什么版本的 spirng ,可以看一下这个方法是否调用了
    ConfusedBiscuit
        9
    ConfusedBiscuit  
       2022-08-19 14:06:55 +08:00
    我很好奇如果两个方法同时被调用了,那么 HTTP 请求的返回是哪个方法的结果呢?如果是其中一个方法的返回值,那么另一个方法的返回值就被丢弃了吗?
    zzl22100048
        10
    zzl22100048  
       2022-08-19 14:11:00 +08:00
    spring 正常不会请求一次调用两个路由的,全匹配是调用第二个,其他情况调用第一个,具体是什么版本的 spring ?
    maocat
        11
    maocat  
       2022-08-19 14:15:58 +08:00 via iPhone
    你没有问题,都是框架的问题.dog
    siweipancc
        12
    siweipancc  
       2022-08-19 16:56:03 +08:00 via iPhone
    就算是框架 bug ,debug 不会吗……请求源对比一下
    intmax2147483647
        13
    intmax2147483647  
       2022-08-19 17:21:33 +08:00   ❤️ 1
    有一说一,养成习惯处理一下 IDE 抛黄的警告,会减少你这类问题的提问。`idCode`, `/getRecCompanyLoginInfo`都报警告了都不管
    lichao
        14
    lichao  
       2022-08-19 17:33:36 +08:00
    idCode 可以用正则限制一下
    hyqCrystal
        15
    hyqCrystal  
       2022-08-22 09:27:16 +08:00
    建议写这种风格的时候 可以把路径搞长一点 增加接口名的特殊性
    Huizhen
        16
    Huizhen  
       2022-08-23 15:05:34 +08:00
    第一个 RequestMapping 的 Value 值这样写不严谨,至少加个前缀 /xx/{idCode}
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5306 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:18 · PVG 16:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.