2012-03-12 4 views
6

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

Проблема заключается в том, что не представляется возможным с 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 ...

+2

У вас есть HTTPMessageConverter иметь производит тип? Когда вы запускаете регистрацию, что вы получаете? – chrislovecnm

+0

Да, я знаю. Если вам интересно: вам нужно добавить приложение/* + json к поддерживаемым типам носителей конвертера сообщений Jackson. Если я удалю один метод, он работает. – Felix

+0

Я получаю ошибку, упомянутую выше. – Felix

ответ

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+produces%22%29+AND+status+%3D+Open

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