【问题标题】:Ambiguous handler methods for http path?http路径的模糊处理程序方法?
【发布时间】:2015-12-26 13:53:44
【问题描述】:

我有一个 Spring 应用程序,我在其中声明了我的类:

@Controller
@RequestMapping(value = "/rest/api/datasources/", produces = MediaType.APPLICATION_JSON_VALUE, method=RequestMethod.GET)
public class MetadataServiceController {
    //Two separate methods:
    @RequestMapping(value="{datasourceName}")
    public Object getLatestApiMetadata(@PathVariable String datasource, 
           @RequestParam (required = false)  String datasourceNum,
           @RequestParam (defaultValue = "true")  String dataFields, 
           @RequestParam ( required=false, defaultValue = "api")  String visibility){
      ... //Implementation here
    }

    @RequestMapping(value="{apiVersion}")
    public @ResponseBody List<DataSource> getAllMetadata(
        @RequestHeader(value="sub-version", required=false, defaultValue="0.0") String minorVer,
        @PathVariable String restApiVersion,
        @RequestParam(required = false) String datasourceNum,
        @RequestParam(defaultValue = "all") String visibility)
        throws ObjectNotFoundException {
    ... //Implementation here
    }

}

但是当我尝试到达这些休息端点之一时,我收到一条错误消息:java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 并将这两种方法指定为问题。我的印象是,如果我更改请求参数,Spring 不会通过这篇文章抱怨它们是相同的:http://www.coderanch.com/t/598675/Spring/handling-HTTP-Request-parameters,但显然它仍然存在。有人对如何解决这个问题有任何建议吗?谢谢!

【问题讨论】:

  • 如果我向http://your.server/rest/api/datasources/foo发送请求,应该调用哪个方法? http://your.server/rest/api/datasources/bar 怎么样?
  • @BoristheSpider 啊是的,但我不是为路径指定了一组不同的请求参数吗?
  • 不,你绝对没有——看我的回答。
  • 您没有指定任何不同的内容。如果要根据请求参数进行路由,则将params 属性添加到RequestMapping 注释中,目前从映射的角度来看没有什么不同。
  • @BoristheSpider 当时很困惑,因为我认为@RequestParam 会为我做这件事。我看了stackoverflow.com/questions/13715811/…,似乎是说@RequestParam注解确实是​​用于基于参数的路由。

标签: java spring rest spring-mvc


【解决方案1】:

对于 Spring 分派请求而言,重要的是 URL 的路径部分。

两个请求映射都捕获放置在路径中的任何值,并且无法区分应该调用哪个方法。在您的示例代码中,对www.example.com/rest/api/datasources/foo 的请求可以由getLatestApiMetadata 处理,其中“foo”是datasourceName,也可以由getAllMetadata 处理,其中“foo”是apiVersion

【讨论】:

  • 啊,好吧。但是我不是为每个路径指定了一组不同的请求参数吗?
  • 请求参数都是从请求上下文中提取的,带有HandlerMethodArgumentResolver链,在确定了将请求分发到的处理程序方法之后。这意味着参数对于确定要调用的方法没有用。
  • 好的。这就说得通了。那么我将如何通过请求参数来区分每个?因为我希望getLatestMetaData 方法端点看起来像/rest/api/datasources/{datasourceName},但getAllMetadata 方法端点看起来像/rest/api/datasources/{apiVersion}?visibility=visibility。这就是为什么我只为 getAllMetadata 方法设置了 @RequestParameter
  • @user1871869 根据我的(已删除)答案,您的请求参数都不是必需的
猜你喜欢
  • 2019-04-14
  • 2014-07-30
  • 2016-05-11
  • 1970-01-01
  • 2011-11-27
  • 2015-12-03
  • 2010-10-16
  • 2018-07-31
  • 2018-03-30
相关资源
最近更新 更多