Я борюсь с правильным способом реализации служб Spring MVC 3.x RESTful с HATEOAS . Примите во внимание следующие ограничения:
] В настоящее время у меня есть красиво скомпонованное приложение 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 / и т. Д. для размещения различных ссылок по мере их появления и исчезновения в ходе разработки.
Мысли?