Cool, thanks. 2014-10-20 10:41 GMT+02:00 Romain Manni-Bucau <rmannibu...@gmail.com>:
> right, you use your own header since there is no standard for > versioning (and actually versioning means a lot of things depending > the company ;)) > > > Romain Manni-Bucau > @rmannibucau > http://www.tomitribe.com > http://rmannibucau.wordpress.com > https://github.com/rmannibucau > > > 2014-10-20 10:38 GMT+02:00 Alex Soto <asot...@gmail.com>: > > yes sorry when I said content I mean the Content field of Header. > > > > 2014-10-20 10:36 GMT+02:00 Romain Manni-Bucau <rmannibu...@gmail.com>: > > > >> sure, only the header does it > >> > >> > >> Romain Manni-Bucau > >> @rmannibucau > >> http://www.tomitribe.com > >> http://rmannibucau.wordpress.com > >> https://github.com/rmannibucau > >> > >> > >> 2014-10-20 10:34 GMT+02:00 Alex Soto <asot...@gmail.com>: > >> > yes but then @Consumes and @Produces not containing the version part: > >> > > >> > @Path("/resource") > >> > > >> > @Consumes({"application/xml", "application/json"}) > >> > > >> > @Produces({"application/xml", "application/json"}) > >> > > >> > public AppApiSubResource getVersionedSubResource() { > >> > > >> > String version = getVersionFromHeader(); > >> > > >> > return SubResourceFactory.getResource(version); > >> > > >> > > >> > } > >> > > >> > because if content also contains version then we are still in original > >> > problem. > >> > > >> > > >> > > >> > > >> > 2014-10-20 10:21 GMT+02:00 Romain Manni-Bucau <rmannibu...@gmail.com > >: > >> > > >> >> You can read the header in the router, route then delegates the impl > >> >> to the next? Also means you can just use rest endpoint to select the > >> >> right impl using same pattern but with a single JAXRS level surely > >> >> (and routing is done to service level). > >> >> > >> >> > >> >> Romain Manni-Bucau > >> >> @rmannibucau > >> >> http://www.tomitribe.com > >> >> http://rmannibucau.wordpress.com > >> >> https://github.com/rmannibucau > >> >> > >> >> > >> >> 2014-10-20 10:17 GMT+02:00 Alex Soto <asot...@gmail.com>: > >> >> > Yes I like the header approach as well, but then I see no way to > >> >> implement > >> >> > it directly using subresources. > >> >> > > >> >> > 2014-10-20 10:14 GMT+02:00 Romain Manni-Bucau < > >> rmannibu...@tomitribe.com > >> >> >: > >> >> > > >> >> >> most of real impl uses path (/v1) but i like header solution. > allows > >> >> >> to handle default correctly without rewrite magic and to add it > for > >> v2 > >> >> >> once forgotten for v1 :) > >> >> >> Romain Manni-Bucau > >> >> >> Twitter: @rmannibucau > >> >> >> Blog: http://rmannibucau.wordpress.com/ > >> >> >> LinkedIn: http://fr.linkedin.com/in/rmannibucau > >> >> >> Github: https://github.com/rmannibucau > >> >> >> > >> >> >> > >> >> >> > >> >> >> 2014-10-20 10:10 GMT+02:00 Jean-Louis Monteiro < > >> >> jlmonte...@tomitribe.com>: > >> >> >> > Right. No magic solution. > >> >> >> > > >> >> >> > I've seen the content type pattern, but it has many drawbacks > so I > >> >> would > >> >> >> > not go with this one. > >> >> >> > > >> >> >> > -- > >> >> >> > Jean-Louis Monteiro > >> >> >> > http://twitter.com/jlouismonteiro > >> >> >> > http://www.tomitribe.com > >> >> >> > > >> >> >> > On Sun, Oct 19, 2014 at 1:48 PM, Alex Soto <asot...@gmail.com> > >> wrote: > >> >> >> > > >> >> >> >> Yes this is what I though about creating a central place, but I > >> was > >> >> >> >> thinking about using a rewrite instead of a subresource. I am > >> going > >> >> to > >> >> >> >> google a bit about this pattern. For what I see there is no > magic > >> >> >> solution > >> >> >> >> yet :( > >> >> >> >> > >> >> >> >> Thanks. > >> >> >> >> > >> >> >> >> 2014-10-19 13:44 GMT+02:00 Romain Manni-Bucau < > >> >> >> rmannibu...@tomitribe.com>: > >> >> >> >> > >> >> >> >> > Hi > >> >> >> >> > > >> >> >> >> > What about sub resource locator pattern? > >> >> >> >> > > >> >> >> >> > For versioning I used a sub resource facade delegating to the > >> real > >> >> >> >> > service then. This is just a router but it allows to put all > the > >> >> logic > >> >> >> >> > in a single place. > >> >> >> >> > Romain Manni-Bucau > >> >> >> >> > Twitter: @rmannibucau > >> >> >> >> > Blog: http://rmannibucau.wordpress.com/ > >> >> >> >> > LinkedIn: http://fr.linkedin.com/in/rmannibucau > >> >> >> >> > Github: https://github.com/rmannibucau > >> >> >> >> > > >> >> >> >> > > >> >> >> >> > > >> >> >> >> > 2014-10-19 13:19 GMT+02:00 Alex Soto <asot...@gmail.com>: > >> >> >> >> > > Hi guys, > >> >> >> >> > > > >> >> >> >> > > this is more a design question than a question about how > to do > >> >> >> >> something > >> >> >> >> > > with JAX-RS. > >> >> >> >> > > > >> >> >> >> > > Currently I am developing an API using JAX-RS which must be > >> >> >> >> versionable. > >> >> >> >> > > That means that the API will evolve and client must specify > >> which > >> >> >> >> version > >> >> >> >> > > of the API want to use. There are a lot of strategies but > >> >> finally I > >> >> >> >> > decided > >> >> >> >> > > to use the one using Header and ContentType. Let me show an > >> >> example: > >> >> >> >> > > > >> >> >> >> > > @Consumes*({*"application/vnd.blog.v1+xml"*,* > >> >> >> >> > "application/vnd.blog.v1+json" > >> >> >> >> > > *})* > >> >> >> >> > > > >> >> >> >> > > @Produces*({*"application/vnd.blog.v1+xml"*,* > >> >> >> >> > "application/vnd.blog.v1+json" > >> >> >> >> > > *})* > >> >> >> >> > > > >> >> >> >> > > *public* *class* Book*RestfulService* *{* > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > @GET > >> >> >> >> > > > >> >> >> >> > > @Path*(*"/books"*)* > >> >> >> >> > > > >> >> >> >> > > …. > >> >> >> >> > > > >> >> >> >> > > } > >> >> >> >> > > > >> >> >> >> > > @Consumes*({*"application/vnd.blog.v1+xml"*,* > >> >> >> >> > "application/vnd.blog.v1+json" > >> >> >> >> > > *})* > >> >> >> >> > > > >> >> >> >> > > @Produces*({*"application/vnd.blog.v1+xml"*,* > >> >> >> >> > "application/vnd.blog.v1+json" > >> >> >> >> > > *})* > >> >> >> >> > > > >> >> >> >> > > *public* *class* Author*RestfulService* *{* > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > @GET > >> >> >> >> > > > >> >> >> >> > > @Path*(*“/authors”*)* > >> >> >> >> > > > >> >> >> >> > > …. > >> >> >> >> > > > >> >> >> >> > > } > >> >> >> >> > > > >> >> >> >> > > That's an example of version one, but now let's say I have > a > >> >> >> >> modification > >> >> >> >> > > only in Author endpoint. I can do it and then the restful > >> will be > >> >> >> v2. > >> >> >> >> So > >> >> >> >> > I > >> >> >> >> > > will have something like: > >> >> >> >> > > > >> >> >> >> > > @Consumes*({*"application/vnd.blog.v2+xml"*,* > >> >> >> >> > "application/vnd.blog.v2+json" > >> >> >> >> > > *})* > >> >> >> >> > > > >> >> >> >> > > @Produces*({*"application/vnd.blog.v2+xml"*,* > >> >> >> >> > "application/vnd.blog.v2+json" > >> >> >> >> > > *})* > >> >> >> >> > > > >> >> >> >> > > *public* *class* Author2*RestfulService* *{* > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > @GET > >> >> >> >> > > > >> >> >> >> > > @Path*(*“/authors”*)* > >> >> >> >> > > > >> >> >> >> > > …. > >> >> >> >> > > > >> >> >> >> > > } > >> >> >> >> > > The problem is that because Book has not received any > >> >> modification, > >> >> >> I > >> >> >> >> > > should add @Consumes and @Produces with v2 as well, > something > >> >> like: > >> >> >> >> > > > >> >> >> >> > > @Consumes*({*"application/vnd.blog.v1+xml"*,* > >> >> >> >> > "application/vnd.blog.v1+json", > >> >> >> >> > > "application/vnd.blog.v2+xml"*,* > >> >> "application/vnd.blog.v2+json"*})* > >> >> >> >> > > > >> >> >> >> > > @Produces*({*"application/vnd.blog.v1+xml"*,* > >> >> >> >> > "application/vnd.blog.v1+json", > >> >> >> >> > > ....*})* > >> >> >> >> > > > >> >> >> >> > > *public* *class* Book*RestfulService* *{* > >> >> >> >> > > > >> >> >> >> > > *}* > >> >> >> >> > > > >> >> >> >> > > So now it is easy but if I have 25 services then I would > need > >> to > >> >> go > >> >> >> one > >> >> >> >> > by > >> >> >> >> > > one and add the media type as well. The problem is that I > can > >> >> miss > >> >> >> one > >> >> >> >> > and > >> >> >> >> > > then the API had a misplaced endpoint. > >> >> >> >> > > > >> >> >> >> > > One thing that I have thought about it is create a > rewriting > >> >> filter > >> >> >> >> > where I > >> >> >> >> > > can intercept the calls and then redirect to the correct > >> >> endpoint. > >> >> >> In > >> >> >> >> > this > >> >> >> >> > > way all the rules will be placed in a single place. > >> >> >> >> > > > >> >> >> >> > > Any hints/experience on this? > >> >> >> >> > > > >> >> >> >> > > Thank you so much. > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > -- > >> >> >> >> > > > +----------------------------------------------------------+ > >> >> >> >> > > Alex Soto Bueno > >> >> >> >> > > www.lordofthejars.com > >> >> >> >> > > > +----------------------------------------------------------+ > >> >> >> >> > > >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> -- > >> >> >> >> +----------------------------------------------------------+ > >> >> >> >> Alex Soto Bueno - Computer Engineer > >> >> >> >> www.lordofthejars.com > >> >> >> >> +----------------------------------------------------------+ > >> >> >> >> > >> >> >> > >> >> > > >> >> > > >> >> > > >> >> > -- > >> >> > +----------------------------------------------------------+ > >> >> > Alex Soto Bueno - Computer Engineer > >> >> > www.lordofthejars.com > >> >> > +----------------------------------------------------------+ > >> >> > >> > > >> > > >> > > >> > -- > >> > +----------------------------------------------------------+ > >> > Alex Soto Bueno - Computer Engineer > >> > www.lordofthejars.com > >> > +----------------------------------------------------------+ > >> > > > > > > > > -- > > +----------------------------------------------------------+ > > Alex Soto Bueno - Computer Engineer > > www.lordofthejars.com > > +----------------------------------------------------------+ > -- +----------------------------------------------------------+ Alex Soto Bueno - Computer Engineer www.lordofthejars.com +----------------------------------------------------------+