On Mon, Jul 13, 2009 at 5:54 AM, Sergey Beryozkin <[email protected]>wrote:
>
>
> /__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
>
> so "/__services/bridging/widgets/" is an extra bit which was not available
> at the URITemplate creation time and it would explain why the match is
> failing.
>
Nice catch!
>
> Can you please post a sample root resource class, as well as the value of
> jaxrs:server/@address.
> Is it something like this :
>
More or less, we don't have a class path, just
public class Widgets {
@GET
@Path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}")
WSWidget renderWidget2(@PathParam("widgetID") Long widgetID,
@PathParam("widgetType") Integer widgetType,
@PathParam("size") Long containerSize,
@PathParam("locale") String locale,
@PathParam("properties") PathSegment props)
throws RemoteBridgeException;
}
>
> and jaxrs:server/@adress="/bridging"
>
it is /bridging/widgets
>
> and CXFServlet url pattern is "/__services/*" ?
>
yes that's the pattern
> Or is it jaxrs:server/@adress="__services/bridging" and CXFServlet url
> pattern = "/*" ?
>
> What are absolute working/broken URIs (lets assume 'webAppName' is the name
> of the web application, and localhost:8080), is it something like :
>
> working :
> http://localhost:8080/webAppName/__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1
> broken :
> http://localhost:8080/webAppName/__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
>
We are testing without webAppName just
http://localhost:8080/__services/...
And both absolute URIs have the same beginning.
>
> By the way is it a double underscore in '__services' ?
>
I just a way to be sure that we won't have conflicts with other URIs that
the server may have
> thanks, Sergey
>
>
>> Hi Sergey,
>>
>> I'm sorry again for the delay.
>>
>> Debugging it I couldn't understand why it isn't working. But here is what
>> I
>> found:
>>
>> With the working URL
>>
>> "renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1":
>>
>> 1) At line 144 of URITemplate
>>
>> 143 Matcher m = templateRegexPattern.matcher(uri);
>> 144 if (!m.matches()) {
>> 145 if (uri.contains(";")) {
>>
>> The value of the variables are:
>>
>> uri =
>> /renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1
>> m =
>>
>> java.util.regex.Matcher[pattern=/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
>> region=0,73
>>
>> lastmatch=/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1]
>> template =
>>
>> /renderwidget2/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}
>> templateRegexPattern =
>>
>> /renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
>>
>> And m.matches() returns true, so that if is skipped and the method returns
>> true. After that our implementation of the service is called.
>>
>> With the NOT working URL
>>
>> "renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar":
>>
>> At that same line 144, the variable values are:
>>
>> uri =
>>
>> /__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
>> m =
>>
>> java.util.regex.Matcher[pattern=/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
>> region=0,109 lastmatch=]
>> template =
>>
>> /renderwidget2/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}
>> templateRegexPattern =
>>
>> /renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
>>
>> But m.matches() returns false. So we enter in the if. We also enter in the
>> if of line 145 "if (uri.contains(";"))".
>> Then the uri is rebuilded, and at line 162:
>>
>> 160 uri = sb.toString();
>> 161 m = templateRegexPattern.matcher(uri);
>> 162 if (!m.matches()) {
>> 163 return false;
>>
>> The value of the variables are:
>>
>> uri =
>>
>> /__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
>> m =
>>
>> java.util.regex.Matcher[pattern=/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
>> region=0,109 lastmatch=]
>>
>> That are the same values that we had at the beginning. So again
>> m.matches()
>> returns false, so we enter to that if on line 162, and the method returns
>> false.
>>
>> I really don't know which is the problem, since as far as I can see both
>> uri
>> should match the pattern. Also I don't know what that first if should do,
>> since we get the same uri.
>>
>> I hope that this help, if you need any other test, please feel free to
>> ping
>> me.
>>
>> Best,
>>
>> Gabriel
>>
>>
>> Sergey Beryozkin-2 wrote:
>>
>>>
>>> I did few more tests today (with/without CXFServlet, with PathSegments)
>>> and I still can't reproduce it so I will give up for a
>>> moment.
>>> But I'm still nervous you managed to hit a problem somehow - can you
>>> please give me a favor and help to get to the bottom of it ?
>>> It should take 30 mins max of your time, download
>>>
>>> http://www.apache.org/dyn/closer.cgi?path=%2Fcxf%2F2.2.2%2Fapache-cxf-2.2.2-src.zip
>>>
>>> and put a breakpoint in URITemplate.match()
>>>
>>> A better news is that after trying to reproduce it, I added a new method
>>> to WebClient which can make it simpler for users to deal
>>> with template parameters, such that they can avoid dealing with
>>> UriBuilder
>>> directly.
>>> So you can do
>>> WebClient client = WebClient.create("http://widgets");
>>>
>>> cleint.path("("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}",
>>> idValue, widgetTypeValue, 1, "en_US",
>>> "properties;1=2").get(Widget.class)
>>>
>>> cheers, Sergey
>>>
>>>
>>> ----- Original Message ----- From: "Gabriel Guardincerri" <
>>> [email protected]>
>>> To: <[email protected]>
>>> Sent: Wednesday, July 01, 2009 10:35 PM
>>> Subject: Problem with matrix params, works with one, but not with two (or
>>> more) params
>>>
>>>
>>>
>>>> Hello,
>>>>
>>>> I'm having a problem where matrix parameters are not recognized past the
>>>> first parameter. When I have one matrix parameter, the method below is
>>>> invoked and the PathSegment.getMatrixParameters() returns the single
>>>> result.
>>>>
>>>> However, if I append a second matrix parameter (or more), the service
>>>> method is not invoked at all and I receive the following error message:
>>>>
>>>> "No operation matching request".
>>>>
>>>> Service interface:
>>>>
>>>> @GET
>>>>
>>>> @Path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}")
>>>> WSWidget renderWidget(@PathParam("widgetID") Long widgetID,
>>>> @PathParam("widgetType") Integer widgetType,
>>>> @PathParam("size") Long containerSize,
>>>> @PathParam("locale") String locale,
>>>> @PathParam("properties") PathSegment props)
>>>> throws RemoteBridgeException;
>>>>
>>>> Working
>>>> URL:
>>>> /renderwidget/id/1007/type/1/size/1/locale/en_US/properties;numResults=1
>>>>
>>>> Broken:
>>>> URL:
>>>>
>>>> /renderwidget/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
>>>>
>>>> The reason I'm trying to use matrix parameters is that I have an
>>>> arbitrary map of name/value for a widget class. I can't try to parse
>>>> them out individually using @MatrixParam, because they vary by widget
>>>> class and are not known at the service level.
>>>>
>>>> Thanks for your help.
>>>> --
>>>> View this message in context:
>>>>
>>>> http://www.nabble.com/Problem-with-matrix-params%2C-works-with-one%2C-but-not-with-two-%28or-more%29-params-tp24297533p24297533.html
>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>>
>>>>
>>>
>>>
>>>
>> --
>> View this message in context:
>> http://www.nabble.com/Problem-with-matrix-params%2C-works-with-one%2C-but-not-with-two-%28or-more%29-params-tp24297533p24413449.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>>
>>
>