Hi Kynan
Yes, an initial attempt to match an operation is done before request handlers are called. It's unfortunate the matched parameters
are stored in the exchange later on - it's been assumed before that RequestHandlers would not need to deal with actual parameter
values (or indeed with operations), rather they may want to affect the selection of operations by updating say the Accept value....
But the moment users can get to the selected operation in filters but not to the actual values. I've fixed locally this issue by
making sure matched parameters info is available - thus actually making it possible for the runtime to properly implement the
injection of contexts like UriInfo into filtrers.
Starting from 2.2.2, there's another option availbale - custom invokers - it
will help you if you can move to 2.2.2 or 2.2.3 :
http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Custominvokers
If you have to stay with 2.2.1 then you can do an another templates match (as
you suggested), should not be really expensive:
UriInfo uriInfo = new UriInfoImpl(message, null);
OperationResourceInfo ori =
message.getExchange().getContent(OperationResourceInfo.class);
MultivaluedMap<String, String> map = new MetadataMap<String, String>();
ori.getURITemplate().match(uriInfo.getPath(), map);
In 2.2.4 you'll be able to do just this in the request handler :
UriInfo uriInfo = new UriInfoImpl(message);
uriInfo.getPathParameters();
it's a new constructor which will extract the template values itself.
Request and Response handlers will also have the injection working eventually
for them like all other JAXRS providers.
cheers, Sergey
----- Original Message -----
From: "Kynan Fraser" <[email protected]>
To: <[email protected]>
Sent: Friday, September 04, 2009 6:10 AM
Subject: Re: JAXRS - Best way to retrieve path parameters in request handler
Hi Gabo,
Thanks for the reply. Yes I had seen all these values but none quite fits
what i'm after.
There's another set of info which is set after request handlers in the
JAXRSInInterceptor which is
message.get(URI_TEMPLATE.TEMPLATE_PARAMETERS), which contains the path
parameters in key/value pair.
This info is built during the JAXRSUtil.findTargetMethod() call using some
uriTemplate.match() calls etc.
I'm really looking for the easiest way to either a) get than info in the
request handler f there's some nifty way of getting it or b) implementing
shortest way of getting it perhaps replicating the uriTemplate matching ..
Regards,
Kynan
Gabo Manuel wrote:
Hi Kynan,
I am not sure if this answers your question, I'll try:
These are what I use for an inbound handler extending
AbstractPhaseInterceptor<Message> at phase Phase.RECEIVE
1. message.get(Message.BASE_PATH) would give you the path
2. message.get(Message.QUERY_STRING) should give you everything on the
right hand side of '?'. Since this would be a key-value pair, getting
the name and value should be easy.
3. message.get(Message.REQUEST_URI) should give you the actual URI used.
This would allow you to manually retrieve your path parameters. I am not
sure how to retrieve the name assigned to that though.
4. message.get(Message.PROTOCOL_HEADERS) would give you all the Http
headers, quite useful for authentication.
Also, if everything you need is done by a specific interceptor, then
maybe calling getAfter().add() at the constructor should cover it. :)
Hth
Gabo
Kynan Fraser wrote:
Hi All,
I'm writing a request handler which deals with the method going to be
invoked and the parameters provided (both query and path, both name and
value of each parameter). However i'm having some problem getting at the
path paramter names and values - well I can ge the names but i need the
values too.
It seems like the easiest way to get path paramters is to use
UriInfo(message) then getPathParameters(). But this requires the
URI_TEMPLATE.TEMPLATE_PARAMETERS to be set on the message to be used in
the
UriInfo constructor. This doesn't seem to be getting done until after the
request handlers are called in the JAXRSInInterceptor.
In CXF 2.2.1 - Request handlers are called on line 158 but the values for
the URI_TEMPLATE.TEMPLATE_PARAMETERS are not set on the message until
line
191.
I figure I can always rerun findTargetMethod() or match the uri template
and
populate it myself but thought there might be a way of getting this which
is
better.
Any tips?
Thanks.
Kynan
------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 8.5.409 / Virus Database: 270.13.76/2343 - Release Date:
09/03/09 05:50:00
--
View this message in context:
http://www.nabble.com/JAXRS---Best-way-to-retrieve-path-parameters-in-request-handler-tp25287837p25288412.html
Sent from the cxf-user mailing list archive at Nabble.com.