【问题标题】:How to correct Spring MVC RequestMapping order?如何更正 Spring MVC RequestMapping 顺序?
【发布时间】:2014-03-15 01:02:42
【问题描述】:

我有一个使用以下 RequestMapping 运行的现有 Spring MVC 服务。

@RequestMapping(value = "{user}/**", method = RequestMethod.GET)

我现在需要使用以下 RequestMapping 向同一个控制器添加一个新方法。

@RequestMapping(value = "api/{user}/**", method = RequestMethod.GET)

当我针对新 URL 进行测试时,Spring 总是选择第一个函数,这样 第二个功能无法访问。

无论如何我可以让 Spring 使用我的新“api”方法吗?我能想到的唯一选择是在我的 web.xml 中创建一个新的 Java servlet,但我想做一些更简单的事情。我确实尝试过使用@Controller@Controller("api") 制作两个不同的控制器,但这并没有解决问题。

【问题讨论】:

  • 改变方法定义的顺序有帮助吗?
  • 我不认为这很重要,但我只是尝试了一下,没有任何区别。
  • 我使用的控制器以“/”开始 @RequestMapping 值。所以我希望看到@RequestMapping(value = "/api...
  • @user636334,我对这种可能的解决方案的可能性感到兴奋,但它没有任何区别。
  • 决定使用什么处理程序编码在org.springframework.util.AntPathMatcher.AntPatternComparator.compare(String, String)

标签: java spring spring-mvc


【解决方案1】:

假设user 的参数是String,Spring 假设您已被用户api 调用。

有几种方法可以解决这个问题。第一个(也是最好的)是使您的请求映射更窄:完全指定映射,而不是依赖最后的“**”。

第二种方法是禁止“api”用户,在您的映射中使用regex。像下面这样的东西应该可以工作:

@RequestMapping(value = "{user:[^a][^p][^i]}/**", method = RequestMethod.GET)

【讨论】:

  • 我们需要 ** 结尾,因为路径部分的数量是可变的。我尝试了您的建议的变体,效果很好。 {user:^(?!api).*}/**
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多