http路径的不明确的处理程序方法?

时间:2015-09-29 07:18:59

标签: java spring rest spring-mvc

我有一个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但显然它仍然存在。有人会对如何解决这个问题有任何建议吗?谢谢!

1 个答案:

答案 0 :(得分:12)

分发请求的Spring重要的是URL的Path部分。

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