2014-04-12 19 views
6

Próbuję dowiedzieć się, jak budować łącza HAL z templated: true. Jeśli używamJak budować łącza HAL za pomocą "templated: true" przy użyciu wiosennych hateo?

BasicLinkBuilder.linkToCurrentMapping().slash("api/public/blogs/{blog}").withRel("blog"); 

W { i } znaki są nadal zakodowane. Masz pomysł, jak utworzyć linki do adresów URL szablonu za pomocą interfejsu API Spring-hateo jako 0.10.0.RELEASE?

Dzięki.

+1

Ja też się nad tym zastanawiam ... dalej zauważysz, jeśli spojrzysz na swoją odpowiedź, która zawiera ten link, że {i} będzie url uciekł ... co nie jest w porządku –

Odpowiedz

3

Zastanawiam się również, w jaki sposób należy to zrobić za pomocą interfejsu API HATEO. Na razie obejrzeliśmy go, generując obiekty Link za pomocą klas BasicLinkBuilder i ControllerLinkBuilder, a następnie dodając szablony zapytań w szablonach do konstruktora new Link(String href). Co ciekawe, tworzy to link z atrybutem templated: true.

Zauważyliśmy, że stara się przekazać w wartościach takich jak {blog} do klas LinkBuilder zakończonych w tych wartościach próbujących być zastąpione od wartości, na obecnym wniosku (tj linkbuilder usiłował znaleźć ?blog=value z bieżącego żądania i zastąpić value do Link, który został zbudowany, a ponieważ to nie istniało, powodował wyjątek:

Mimo że obejście tego problemu nie jest szczególnie przyjemne, mój zespół nie był w stanie znaleźć żadnego sposobu na uzyskanie szablonów w LinkBuilders za pośrednictwem interfejsu API bez powodowania problemów

+0

Używam UriTemplate do tworzenia szablonów URI, a następnie przejść do nowego łącza(). Zobacz mój blog https://www.jiwhiz.com/post/2014/4/Design_and_Build_RESTful_API_with_Spring_HATEOAS i mój projekt open source na https://github.com/jiwhiz/JiwhizBlogWeb. Mam nadzieję, że Spring HATEOAS może zapewnić bardziej formalny interfejs API, aby to zrobić. – jiwhiz

+0

To prawie to samo miejsce, do którego doszedł mój zespół –

+0

@jiwhiz Robię prawie tyle samo, co opisałeś. Problem polega na tym, że 'ControllerLinkBuilder' używa' org.springframework.web.util.UriTemplate', który nie pozwala na nierozwiązane zmienne. Istnieje "org.springframework.hateoas.UriTemplate", który wydaje się wykonywać zadanie, ale wtedy, gdy renderowane łącza nie zawierają atrybutu "templated: true", chociaż w debugerze widzę, że metoda 'Link.isTemplated' zwraca true. Również linki są renderowane względnie, ponieważ klasa budowniczego poprzedzająca ścieżkę kontekstu et. al jest zasięgiem pakietu w 'ControllerLinkBuilder'. –

1

Aby uzyskać nawiasy w linkach, skończyło się z nieco roztworu hacky, ale jako czasowe obejście działa:

  • utworzyć klasę:
public class BracketsLink extends Link { 
    public BracketsLink(Link link) { 
     super(link.getHref().replaceAll("%7B", "{").replaceAll("%7D", "}"), link.getRel()); 
    } 
} 
  • i tworzyć linki za pomocą BracketsLink Klasa:
new BracketsLink(linkTo(methodOn(MessageController.class).message("{id}")).withRel("message"))