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.