Я борюсь с правильным способом реализации Spring MVC 3.x RESTful-сервисов с HATEOAS .Рассмотрим следующие ограничения:
- Я не хочу, чтобы мои доменные объекты были загрязнены конструкциями web / rest.
- Я не хочу, чтобы мои контроллеры были загрязнены конструкциями представления.
- Я хочу поддерживать несколько представлений.
В настоящее время у меня есть прекрасно составленное приложение MVC без HATEOAS.Доменные сущности - это чистые POJO без каких-либо представлений или веб-концепций.Например:
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 / что угодно в среде разрешения представления Spring.Одним из способов сделать это может быть обертывание рассматриваемого POJO с помощью универсального класса Resource, который содержит список ссылок.Некоторая подстройка представления потребовалась бы, чтобы сжать это в формат, который я хочу, но это выполнимоК сожалению, вложенные ресурсы не могут быть упакованы таким образом.Другие вещи, которые приходят на ум, включают добавление ссылок на ModelAndView, а затем настройку каждого из готовых преобразователей представления Spring для вставки ссылок в сгенерированный JSON / XML / etc.Чего я не хочу, так это постоянно создавать вручную JSON / XML / и т. Д.для размещения различных ссылок по мере их появления в процессе разработки.
Мысли?