Согласование контента в Spring MVC - PullRequest
3 голосов
/ 04 июля 2011

Я пишу веб-приложение RESTful с Spring 3, и часть моего приложения должна обрабатывать данные в соответствии с запрошенным типом носителя.

@RequestMapping(...)
public String process() {
  if(requested_media_type_is_xml) {
     processXml();
  }
  else if(requested_media_type_is_json) {
     processJson();
  }
  return something;
}

Ака, логика моего приложения совершенно другая, если клиентзапрашивает другой тип мультимедиа, поэтому кажется, что SpringN ContentNegotiatingViewResolver или конвертер сообщений не очень полезны в этом случае, потому что я хочу направить запрос к другому коду обработки, а не запускать один и тот же фрагмент кода и отобразить их в другом формате в соответствии с запрошенным типом мультимедиа.

Насколько я знаю, в JAX-RS, Джерси, например, вы можете использовать аннотацию @Consume для этого.Интересно, что это за способ Spring?Спасибо.

Ответы [ 2 ]

10 голосов
/ 07 июля 2011

Хотя ответ Скаффмана правильный, я обнаружил в последнем выпуске Spring (3.1 M2), есть альтернативный и лучший способ сделать это, используя значения consumes и produces:

@RequestMapping(value="/pets", consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
    // ...
}

@Controller
@RequestMapping(value = "/pets/{petId}", produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
    // ...
}

Пожалуйста, проверьте более подробную информацию здесь: http://blog.springsource.com/2011/06/13/spring-3-1-m2-spring-mvc-enhancements-2/

Обновление:

Вот официальная документация Spring об этом:

http://static.springsource.org/spring/docs/3.1.0.M2/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-consumes

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

2 голосов
/ 04 июля 2011

Аннотация @RequestMapping имеет необязательный атрибут headers, который позволяет сузить сопоставление запросам с конкретными заголовками, например, для соответствия XML:

@RequestMapping(value = "/something", headers = "content-type=application/xml")

Вы также можете указать несколько вариантов:

@RequestMapping(value = "/something", headers = [{"content-type=application/xml","content-type=text/xml"}])

Это немного низкий уровень, но делает свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...