Spring MVC 3.1 — управление версиями веб-сервисов REST

Я хочу изменить версию своего веб-сервиса REST, предоставив разные значения заголовка Accept для разных версий (см. ="noreferrer">http://barelyenough.org/blog/2008/05/versioning-rest-web-services/).

Проблема в том, что это невозможно с Spring MVC 3.

Мой контроллер выглядит так:

@Controller
@RequestMapping("test")
public class RestController {

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.example.item-v1+json")
@ResponseBody
public ItemV1 getItem() {
    return new ItemV1();
}

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.example.item-v2+json")
@ResponseBody
public ItemV2 getItem2() {
    return new ItemV2();
}
}

Когда я пытаюсь получить доступ к одному из этих методов, я получаю исключение:

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/test'

Я что-то упустил, или это невозможно с Spring MVC? Я знаю, что это возможно с JAX-RS...


person Felix    schedule 12.03.2012    source источник
comment
У вас есть HTTPMessageConverter, чтобы иметь тип «производит»? Когда вы запускаете ведение журнала, что вы получаете?   -  person chrislovecnm    schedule 12.03.2012
comment
Да. Если вам интересно: вы должны добавить application/*+json к поддерживаемым типам мультимедиа конвертера сообщений Джексона. Если я удалю один метод, он работает.   -  person Felix    schedule 13.03.2012
comment
Я получаю только ошибку, упомянутую выше.   -  person Felix    schedule 13.03.2012
comment
Может быть, Spring сверяет значения produces с классом MediaType? Может быть, вам нужно расширить этот класс и добавить к нему свои собственные значения?   -  person nickdos    schedule 14.03.2012
comment
Я так не думаю, потому что это тоже не сработает, если я изменю типы мультимедиа моего примера на application/json и application/xml.   -  person Felix    schedule 14.03.2012
comment
Вы должны иметь дело со свойством потребления @RequestMapping, чтобы иметь две разные точки входа.   -  person Vincent Devillers    schedule 14.03.2012
comment
Я не совсем понимаю. Эти методы ничего не потребляют, т.е. у них нет аргументов.   -  person Felix    schedule 15.03.2012


Ответы (1)


http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-produces

Это должно быть возможно, как у вас есть вещи. Как вы указываете заголовок Accept в запросе GET? Вы на 100% уверены, что ваш запрос GET отправляет значение заголовка Accept, которое будет соответствовать только одному или другому из указанных вами типов контента? Если вы отправите заголовок, который соответствует обоим, тогда Spring не будет знать, какой метод обработчика должен обрабатывать запрос.

Возможно, вам придется включить ведение журнала org.springframework в DEBUG, чтобы увидеть, что происходит, или использовать отладчик точки останова и исходный код Spring, чтобы увидеть, что происходит на самом деле. «Производит» — это относительно новая функция, поэтому также возможно, что в ней есть ошибка.

https://jira.springsource.org/secure/IssueNavigator.jspa?reset=true&jqlQuery=project+%3D+SPR+AND+%28summary+%7E+%22mvc+produces%22+OR+description+%7E+%22mvc+выдает%22%29+И+статус+%3D+Открыть

person sdouglass    schedule 24.03.2012