Я изо всех сил стараюсь внедрить службы 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<User> 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/что угодно в рамки разрешения w760. Один из способов сделать это может заключаться в том, чтобы связать POJO с общим классом ресурсов, который содержит список ссылок. Для того, чтобы хрустнуть в формат, который я хочу, потребуется некоторое изменение настроек, но его выполнимость. К сожалению, вложенные ресурсы не могут быть обернуты таким образом. Другие вещи, которые приходят на ум, включают добавление ссылок на ModelAndView, а затем настройку каждого из Spring готовых решений для отображения ссылок на созданный JSON/XML/и т.д. Я не хочу постоянно обрабатывать JSON/XML и т.д. для размещения различных ссылок, когда они приходят и уходят в процессе развития.
Мысли?