【问题标题】:How to avoid Spring's @RequestMapping paths conflicts?如何避免 Spring 的 @RequestMapping 路径冲突?
【发布时间】:2014-04-18 12:29:55
【问题描述】:

我想使用 Spring 定义 REST API。我有这 2 个 @Controller 方法:

@RequestMapping(value = "/{machineId}/workspaces/{workspaceId}", method = RequestMethod.DELETE)
public void removeWorkspace(@PathVariable String machineId, @PathVariable String workspaceId {...}

@RequestMapping(value = "/{machineId}", method = RequestMethod.DELETE)
public void removeVM(@PathVariable String machineId) {...}

问题是,这个定义导致路径冲突:如果我尝试调用

curl -X DELETE http://localhost/machine-1/workspaces/workspace-1

我希望应该调用“removeWorkspace”,但问题是调用了“removeVM”。有人知道如何避免这种冲突吗? {machineId} 前缀可能会导致此冲突。当然,我想保持这些路径不变。

谢谢

【问题讨论】:

  • 请显示这件事的例外情况。
  • 哪个例外?也不例外,只是Spring调用了错误的方法。
  • 好的。 Best match。正在调查...
  • 刚刚用 Spring MVC 4.0.3 测试过,效果很好
  • 感谢测试。我在 Spring 3.1.1

标签: java spring rest path conflict


【解决方案1】:

这是在 4.1-RC2 版本中修复的同时修复的错误,请参阅此 JIRA SPR-10576 了解更多详细信息。

因此,在当前版本中修复它的唯一方法似乎是更改 URL 路径,或手动应用补丁。

【讨论】:

    【解决方案2】:

    您可以尝试使用正则表达式来解释 spring 说 @RequestMapping(value = "/{machineId}", method = RequestMethod.DELETE) 不应该匹配 http://localhost/machine-1/workspaces/workspace-1

    我以前没有尝试过,但也许它对你有用:

      @RequestMapping(value = "/{machineId:[^/]*}", method = RequestMethod.DELETE)
      public void removeVM(@PathVariable String machineId) {...}
    

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2019-05-16
      相关资源
      最近更新 更多