HATEOAS
uriInfo
.getAbsolutePathBuilder()
|
|__ uriBuilder
.path("algo") /algo/
.path(AnyResource.class)
.path(MessageResource.class) /mensajes/
uriInfo.getBaseUriBuilder() http://localhost:8080/miblog/webapi/
.path(MessageResource.class) /mensajes
.path(Long.toString(message.getId()) /{messageId}
.build();
Se crea una clase Link en model
public class Link { private String link; private String rel;setters y getters...
Se integra el campo a MessageResource
private List<Link> links = new ArrayList<>();y sus métodos
public List<Link> getLinks() { return links; } public void setLinks(List<Link> links) { this.links = links; } public void addLink(String url, String rel) { Link link = new Link(); link.setLink(url); link.setRel(rel); links.add(link); }
y getMessage se prepara para integrar el uri y rel. , regresando links.
@GET@Path("/{messageId}") public Message getMessage(@PathParam("messageId") long Id, @Context UriInfo uriInfo) { Message message = messageService.getMessage(Id); message.addLink( getUriForSelf(uriInfo, message),"self"); return message; } private String getUriForSelf(@Context UriInfo uriInfo, Message message) { return uriInfo.getBaseUriBuilder() .path(MessageResource.class) .path(Long.toString(message.getId())) .build() .toString(); }
El resultado
Procedimiento similar es agregar el perfile a los links.
private String getUriForProfile(UriInfo uriInfo, Message message) { return uriInfo.getBaseUriBuilder() .path(ProfileResources.class) .path(message.getAuthor()) .build() .toString(); }En el caso de agregar los comentarios, hay que hacer una rebusqueda del path de los recursos, ya que como es un subrecurso el solo comando .path(CommentsResources.class) no es suficiente, ya que solo nos dara "/", así que hay que construir la ruta de /mensaje/{mensajeId}/comentarios/{comentariosId}, para eso Jersey nos ayuda.
@GET@Path("/{messageId}") public Message getMessage(@PathParam("messageId") long Id, @Context UriInfo uriInfo) { Message message = messageService.getMessage(Id); message.addLink( getUriForSelf(uriInfo, message),"self"); message.addLink( getUriForProfile(uriInfo, message), "profile"); message.addLink( getUriForComment(uriInfo, message), "comments"); return message; } private String getUriForComment(UriInfo uriInfo, Message message) { return uriInfo.getBaseUriBuilder() .path(MessageResource.class) .path(MessageResource.class,"getCommentResource") .path(CommentResource.class) .resolveTemplate("messageId", message.getId()) .build() .toString(); } private String getUriForProfile(UriInfo uriInfo, Message message) { return uriInfo.getBaseUriBuilder() .path(ProfileResources.class) .path(message.getAuthor()) .build() .toString(); }
En el subrecurso, tenemos en el path messageId, el cual hay que obtener, para ello se usa revolveTemplate(...)
@Path("/{messageId}/comentarios") public CommentResource getCommentResource() { return new CommentResource(); }
Y tenemos el resultado
Jersey tiene una class Link que se puede usar como alternativa.
fin texto.
No hay comentarios:
Publicar un comentario