2015-09-29 7 views
1

У меня есть Spring приложение, в котором я объявил мой класс так:Неоднозначные методы обработки для http-пути?

@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, но ясно, что он все еще делает. У кого-нибудь есть предложения по тому, как обойти это? Благодаря!

+0

Если я отправляю запрос на 'http: // your.server/rest/api/datasources/foo', какой метод следует вызывать? Как насчет 'http: // your.server/rest/api/datasources/bar'? –

+0

@BoristheSpider ах да, но не я указал другой набор параметров запроса для путей? – user1871869

+0

Нет, вы абсолютно этого не сделали - см. Мой ответ. –

ответ

10

Важно, чтобы Spring для отправки запроса была частью пути URL-адреса.

Оба сопоставления запросов фиксируют любое значение, помещенное в путь, и невозможно отличить, какой метод следует вызывать. В вашем примере кода запрос www.example.com/rest/api/datasources/foo может обрабатываться getLatestApiMetadata, где «foo» - это datasourceName, а также обрабатывается getAllMetadata, где «foo» - это apiVersion.

+0

Ах ладно. но не я указал другой набор параметров запроса для каждого пути? – user1871869

+0

Параметры запроса извлекаются из контекста запроса с помощью цепочки HandlerMethodArgumentResolver после того, как был определен метод обработчика для отправки запроса. Значение параметров не полезно для определения метода для вызова. –

+0

Хорошо. в этом есть смысл. Тогда как бы я различал каждый по параметру запроса? потому что я хочу, чтобы конечная точка метода getLatestMetaData' выглядела как '/ rest/api/datasources/{datasourceName}', но конечная точка метода getAllMetadata' выглядела как '/ rest/api/datasources/{apiVersion}? visibility = visibility'. Вот почему я сделал '@ RequestParameter', требуемый только для метода getAllMetadata. – user1871869

Смежные вопросы