Обработка нескольких типов контента в Spring MVC ... какой подход предпочтительнее? - PullRequest
2 голосов
/ 10 декабря 2010

Итак, мы подошли к тому моменту в нашем приложении Spring, где нам нужно решить, как обрабатывать представления и согласовывать контент. Ранее мы поддерживали только один конкретный тип контента в наших конечных точках.

Я собираюсь бросить наши, как мне кажется, наши три подхода.

Мой вопрос: Какой из них обычно считается наилучшей практикой / минимальное количество обслуживания? Мы стремимся к твердому соглашению, которому необходимо следовать в нашем приложении, которое может быть нарушено при необходимости, чтобы обеспечить гибкость при желании.

Первый подход:
Используйте ContentNegotiatingViewResolver. Это может включать отображение, определенное в файле сервлета ... в контроллере, каждое действие контроллера должно было бы явно установить объект на карте, используя некоторую магическую строку. Действие контроллера вернет строку, которая ссылается на имя шаблона ... вроде как:

@RequestMapping(value = "/someMapping/source", method = RequestMethod.GET)
public String foo(Model model)
{
    // more stuff here
    model.addAttribute(SOME_MODEL_KEY, new ArrayList<String>() { "hello world"});

    return "someDummyJsonString";
}

Недостатки:
Средство распознавания представлений кажется немного громоздким ... у них есть приоритеты, вам нужно часто переопределять их и т. Д. Кроме того, мне не нравится идея "магических строк", которые используются для ссылки на имена шаблонов / представлений bean.

Второй подход:
Я думаю, что это новое в Spring 3.0, но в RequestMapping вы можете сопоставить заголовки ... так что вы можете сопоставить заголовок Accept следующим образом:

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=application/json")
public @ResponseBody SomeBar foo() 
{
  // call common controller code here
  return buildBar();
}

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=text/xml")
public String foo(Model model) 
{
  model.addAttribute("someModelName", this.buildBar()); 
  return "someTemplateNameProcessedByViewResolver";
}

SomeBar buildBar() 
{
   return new SomeBar();
}

Недостатки:
Может быть недостаточно гибким? Я не уверен, но я думаю, что мне действительно нравится подход headers ... Я видел, как другие фреймворки (RESTLet, Rails) используют нечто подобное.

Третий подход:
Третий подход заключается в создании пользовательского View, который будет согласовывать содержимое на основе заголовка Accept и передавать модель соответствующим методом. Это представление согласования содержимого должно знать шаблон и загружать шаблон и т. Д.

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=text/xml")
public View foo() 
{
  SomeBar bar = new SomeBar();
  ContentNegotiatingView view = new ContentNegotiatingView(bar, "templateName");

  return return view;
}

Недостатки:
Кажется, что в этом случае представление делает слишком много ... представление будет смотреть на заголовки и устанавливать само тело ответа. Может также потребоваться установить статусы http.

Итак, извините за стену текста, дайте мне знать ваши мысли по этому поводу. Спасибо

1 Ответ

2 голосов
/ 10 декабря 2010

Кто-то еще просто спросил это . Смотри мой ответ .

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