Spring MVC, REST и HATEOAS

Я борюсь с правильным способом реализации служб Spring MVC 3.x RESTful с HATEOAS . Примите во внимание следующие ограничения:

  • Я не хочу, чтобы объекты моего домена были загрязнены конструкциями web / rest.
  • Я не хочу, чтобы мои контроллеры были загрязнены конструкциями представлений.
  • Я хочу поддерживать несколько представлений.

] В настоящее время у меня есть красиво скомпонованное приложение MVC без HATEOAS. Сущности домена - это чистые объекты POJO без каких-либо встроенных представлений или концепций web / rest. Например:

class User {
   public String getName() {...}
   public String setName(String name) {...}
   ...
}

Мои контроллеры тоже простые. Они обеспечивают маршрутизацию и статус, а также делегируют структуру разрешения представлений Spring. Обратите внимание, что мое приложение поддерживает JSON, XML и HTML, но ни один объект или контроллер домена не имеют встроенной информации о представлении:

@Controller
@RequestMapping("/users")
class UserController {

  @RequestMapping
  public ModelAndView getAllUsers() {
    List users = userRepository.findAll();
    return new ModelAndView("users/index", "users", users);
  }

  @RequestMapping("/{id}")
  public ModelAndView getUser(@PathVariable Long id) {
    User user = userRepository.findById(id);
    return new ModelAndView("users/show", "user", user);
  }
}

Итак, теперь моя проблема - я не уверен в чистом способе поддержки HATEOAS. Вот вам пример. Скажем, когда клиент запрашивает пользователя в формате JSON, это получается примерно так:

{
  firstName: "John",
  lastName: "Smith"
}

Допустим также, что когда я поддерживаю HATEOAS, я хочу, чтобы JSON содержал простую ссылку «self», которую клиент может затем использовать для обновить объект, удалить его или что-то еще. В нем также может быть ссылка «друзья», указывающая, как получить список друзей пользователя:

{
  firstName: "John",
  lastName: "Smith",
  links: [
    {
      rel: "self",
      ref: "http://myserver/users/1"
    },
    {
      rel: "friends",
      ref: "http://myserver/users/1/friends"
    }
  ]
}

Каким-то образом я хочу прикрепить ссылки к своему объекту. Я считаю, что правильное место для этого находится на уровне контроллера, поскольку все контроллеры знают правильные URL-адреса. Кроме того, поскольку я поддерживаю несколько представлений, мне кажется, что правильнее всего как-то украсить объекты моего домена в контроллере, прежде чем они будут преобразованы в JSON / XML / что-то еще в структуре разрешения представлений Spring. Один из способов сделать это может заключаться в том, чтобы обернуть интересующий объект POJO универсальным классом ресурсов, который содержит список ссылок. Потребуется некоторая настройка вида, чтобы преобразовать его в нужный мне формат, но это выполнимо. К сожалению, вложенные ресурсы нельзя было обернуть таким образом. Другие вещи, которые приходят в голову, включают добавление ссылок на ModelAndView,а затем настроить каждый из готовых преобразователей представлений Spring для вставки ссылок в сгенерированный JSON / XML / и т. д. Я не хочу постоянно создавать вручную JSON / XML / и т. Д. для размещения различных ссылок по мере их появления и исчезновения в ходе разработки.

Мысли?

24
задан SingleShot 23 January 2012 в 21:08
поделиться