Я борюсь с правильным способом реализации Spring MVC 3.x RESTful сервисов с HATEOAS. Рассмотрим следующие ограничения:Spring MVC, REST и 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, чтобы содержать простое «я» ссылку, что клиент может затем использовать, чтобы обновить объект, удалить его или что-то еще. Это может также иметь «друзей» ссылку, указывающую, как получить список пользователя друзей:
{
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's, чтобы заполнить ссылки в сгенерированный JSON/XML/и т. Д. Я не хочу постоянно обрабатывать JSON/XML и т. Д. для размещения различных ссылок, когда они приходят и уходят в процессе развития.
Мысли?
В настоящее время проект Spring Data называется [Spring Data - Rest] (http://www.springsource.org/spring-data/rest), который поддерживает HATEOAS в той или иной форме. – SingleShot
или вы можете использовать автономный модуль [spring-hateoas] (https://github.com/SpringSource/spring-hateoas). – Mariusz