Mam problemy z prawidłowym sposobem wdrożenia usług RESTful Spring MVC 3.x z HATEOAS. Rozważ następujące ograniczenia:Spring MVC, REST i HATEOAS
- Nie chcę, aby moje encje domeny były zanieczyszczone konstrukcjami web/rest.
- Nie chcę, aby moje kontrolery były zanieczyszczone przez konstrukcje widokowe.
- Chcę obsługiwać wiele widoków.
Obecnie mam ładnie złożoną aplikację MVC bez HATEOAS. Jednostki domeny są czystymi obiektami POJO bez żadnego widoku lub osadzonych koncepcji web/rest. Na przykład:
class User {
public String getName() {...}
public String setName(String name) {...}
...
}
Moje sterowniki są również proste. Zapewniają routing i status oraz delegują do Spring's resolution framework. Uwaga mojej aplikacji obsługuje JSON, XML i HTML, jeszcze nie podmioty lub kontrolery domen zostały osadzone wyświetlić informacje:
@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);
}
}
Więc teraz mój problem - nie jestem pewien czystym sposób wspierania hateoas. Oto przykład. Powiedzmy, gdy klient prosi o użytkownika w formacie JSON, to wychodzi tak:
{
firstName: "John",
lastName: "Smith"
}
Załóżmy też, że kiedy Popieram hateoas, chcę JSON zawierają prostą „ja” link, który klient może następnie użyć do odświeżenia obiektu, usunięcia go lub czegoś innego. To może również mieć „przyjaciół” odnośnik wskazujący, jak uzyskać listę użytkownika przyjaciół:
{
firstName: "John",
lastName: "Smith",
links: [
{
rel: "self",
ref: "http://myserver/users/1"
},
{
rel: "friends",
ref: "http://myserver/users/1/friends"
}
]
}
Jakoś chcesz dołączyć linki do mojego obiektu. Uważam, że właściwym miejscem do tego jest warstwa kontrolera, ponieważ wszystkie kontrolery znają poprawne adresy URL. Dodatkowo, ponieważ obsługuję wiele widoków, uważam, że właściwą rzeczą jest udekorowanie moich jednostek domeny w kontrolerze, zanim zostaną one przekonwertowane do JSON/XML/cokolwiek w ramach wglądu w Spring. Jednym ze sposobów na zrobienie tego może być owinięcie danego POJO ogólną klasą zasobów zawierającą listę łączy. Konieczne będzie dostosowanie niektórych widoków, aby dopasować go do formatu, który chcę, ale jest to wykonalne. Niestety zagnieżdżone zasoby nie mogą być opakowane w ten sposób. Inne rzeczy, które przychodzą na myśl, to dodawanie linków do ModelAndView, a następnie dostosowywanie każdego z wyskakujących widoków Springa do wstawiania linków do wygenerowanego JSON/XML/etc. To, czego nie chcę, to ciągłe ręczne tworzenie JSON/XML/etc. w celu dostosowania różnych połączeń, gdy przychodzą i odchodzą w trakcie rozwoju.
Myśli?
Istnieje teraz projekt danych Spring zwany [Spring Data - Rest] (http://www.springsource.org/spring-data/rest), który obsługuje HATEOAS w jakiejś formie. – SingleShot
lub możesz bezpośrednio użyć modułu autonomicznego [spring-hateoas] (https://github.com/SpringSource/spring-hateoas). – Mariusz