Estoy luchando con la forma correcta de implementar los servicios Spring MVC 3.x RESTful con HATEOAS. Tenga en cuenta las siguientes limitaciones:Spring MVC, REST y HATEOAS
- No quiero que las entidades de mi dominio estén contaminadas con construcciones web/de reposo.
- No quiero que mis controladores estén contaminados con construcciones de vista.
- Quiero admitir vistas múltiples.
Actualmente tengo una aplicación MVC muy bien preparada sin HATEOAS. Las entidades de dominio son POJO puros sin conceptos de vista o web/resto incrustados. Por ejemplo:
class User {
public String getName() {...}
public String setName(String name) {...}
...
}
Mis controladores también son simples. Proporcionan enrutamiento y estado, y delegan al marco de resolución de vista de Spring. Tenga en cuenta que mi aplicación es compatible con JSON, XML, HTML y, sin embargo, no hay entidades del dominio o los controladores se han incorporado información de vista:
@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);
}
}
Así pues, ahora mi problema - no estoy seguro de una manera limpia para apoyar HATEOAS. Aquí hay un ejemplo. Digamos que cuando el cliente pide un usuario en formato JSON, que salga de esta manera:
{
firstName: "John",
lastName: "Smith"
}
Supongamos también que cuando yo apoyo HATEOAS, quiero que el JSON para contener un simple enlace de "auto" que el cliente puede usar para actualizar el objeto, eliminarlo o cualquier otra cosa. También podría tener un enlace de "amigos" que indica cómo obtener la lista de usuarios de amigos:
{
firstName: "John",
lastName: "Smith",
links: [
{
rel: "self",
ref: "http://myserver/users/1"
},
{
rel: "friends",
ref: "http://myserver/users/1/friends"
}
]
}
De alguna manera me desea adjuntar enlaces a mi objeto. Siento que el lugar correcto para hacerlo es en la capa de controladores, ya que todos los controladores conocen las URL correctas. Además, dado que soporto múltiples vistas, siento que lo correcto es decorar de alguna manera las entidades de mi dominio en el controlador antes de que se conviertan a JSON/XML/lo que sea en el marco de resolución de vistas de Spring. Una forma de hacerlo podría ser envolver el POJO en cuestión con una clase genérica de Recursos que contenga una lista de enlaces. Sería necesario ajustar algunas vistas para ajustarlo al formato que quiero, pero es factible. Lamentablemente, los recursos anidados no se pudieron ajustar de esta manera. Otras cosas que me vienen a la mente incluyen agregar enlaces a ModelAndView, y luego personalizar cada uno de los resolvedores de vista listos para usar de Spring para agregar enlaces al JSON/XML/etc generado. Lo que no quiero es estar constantemente creando a mano JSON/XML/etc. para acomodar varios enlaces a medida que van y vienen durante el curso del desarrollo.
¿Pensamientos?
Ahora hay un proyecto de Spring Data llamado [Spring Data - Rest] (http://www.springsource.org/spring-data/rest) que admite HATEOAS de alguna forma. – SingleShot
o puede usar el módulo independiente [spring-hateoas] (https://github.com/SpringSource/spring-hateoas) directamente. – Mariusz