Hi Sergey,

Just found an issue with this matching - if a class level resource has a
path parameter in it then the operation resource info won't return/contain
that.

ie.
@Path("/something/{id}/more")
public class classA{

   @Path("/details/{idx}/")
   public void methodB(){
  }
}

Then this:

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);

will not contain the first {id} param because its an operation level object
not class level. Alternatively if i use the ClassResourceInfo for matching,
I won't get method level PathParam's.

Is there a way in a request handler to match against the entire path or is
this not possible?

Regards,
Kynan


Sergey Beryozkin-2 wrote:
> 
> 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" <kynan.fra...@customware.net>
> To: <users@cxf.apache.org>
> 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.
>> 
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/JAXRS---Best-way-to-retrieve-path-parameters-in-request-handler-tp25287837p25449020.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to