|
View:
New views
14 Messages
—
Rating Filter:
Alert me
|
|
|
Problem with matrix params, works with one, but not with two (or more) paramsHello,
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. |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi
I think ServletController may not be handling URIs with multiple matrix parameters attached to the last path segment, even the single parameter was not working on the last segment - I'll look into it asap Is it possible for you to attach multiple matrix parameters to one of the previous segments, as a temp workaround ? cheers, Sergey ----- Original Message ----- From: "Gabriel Guardincerri" <gguardin@...> To: <users@...> 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. > |
|
|
|
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Sergey,
Thanks again for your quick response. We are using the latest version, 2.2.2, so not sure what's going on. We are changing to another approach, trying to have simpler URLs. Thank you anyway, Gabriel
|
|
|
RE: Problem with matrix params, works with one, but not with two (or more) paramsHi Gabriel
It would help if you could find a bit of time and create a JIRA with a sample test case - perhaps there's still some flaw somewhere in the chain... Are you using CXFServlet ? Or if you could debug (have a breakpoint in ServletController and then in JAXRSInInterceptor) then it would be of help too... Cheers, Sergey -----Original Message----- From: Gabriel Guardincerri [mailto:gguardin@...] Sent: 02 July 2009 18:45 To: users@... Subject: Re: Problem with matrix params, works with one, but not with two (or more) params Hi Sergey, Thanks again for your quick response. We are using the latest version, 2.2.2, so not sure what's going on. We are changing to another approach, trying to have simpler URLs. Thank you anyway, Gabriel Sergey Beryozkin-2 wrote: > > Hi, > > I have few tests which post URIs like this one : > > POST > /test/services/rest/bookstore/books/378/subresource2/CXF%20;n3=Acti;n33= on%20?n2=in+ > > And things are working fine. > > In fact, I tried your method too with WebClient (at the moment it can't > handle PathSegments, so I juts introduced two matrix params) > : > > GET > /test/services/rest/bookstore/books/378/renderwidget/id/1/type/2/size/3/ locale/en_US/properties;m1=m11;m2=m22 > > "renderwidget/id/1/type/2/size/3/locale/en_US/properties;m1=m11;m2=m22" > > What version are you using ? > > > thanks, Sergey > > ----- Original Message ----- > From: "Sergey Beryozkin" <sberyozk@...> > To: <users@...> > Sent: Thursday, July 02, 2009 11:00 AM > Subject: Re: Problem with matrix params, works with one, but not with > (or more) params > > >> Hi >> >> I think ServletController may not be handling URIs with multiple matrix >> parameters attached to the last path segment, even the >> single parameter was not working on the last segment - I'll look into it >> asap >> Is it possible for you to attach multiple matrix parameters to one of the >> previous segments, as a temp workaround ? >> >> cheers, Sergey >> >> ----- Original Message ----- >> From: "Gabriel Guardincerri" <gguardin@...> >> To: <users@...> >> 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: >>> >>> >>> 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-bu t-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-bu t-not-with-two-%28or-more%29-params-tp24297533p24311138.html Sent from the cxf-user mailing list archive at Nabble.com. |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsI 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" <gguardin@...> To: <users@...> 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. > |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Sergey,
Sorry for the delay, sure, I'll try it. I'm on holidays now, but I can do it on Monday. Best, Gabriel
|
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi 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
|
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Gabriel
This is very helpful - thanks a million ! I'll look into it and see if I can figure out what's going on... Andy, if you read it, may be you fancy looking into it :-) ? cheers, Sergey ----- Original Message ----- From: "Gabriel Guardincerri" <gguardin@...> To: <users@...> Sent: Thursday, July 09, 2009 5:33 PM Subject: Re: Problem with matrix params, works with one, but not with two (or more) params > > 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" <gguardin@...> >> To: <users@...> >> 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. > |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Gabriel
I've done few more URITemplate unit tests and it's working fine so it appears that the fault is elsewhere, perhaps at the CXFServlet/ServletController layer. In the case when it's not working I can see that the URI value is /__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. Can you please post a sample root resource class, as well as the value of jaxrs:server/@address. Is it something like this : @Path("/widgets") public class Widgets { @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; } and jaxrs:server/@adress="/bridging" and CXFServlet url pattern is "/__services/*" ? 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 By the way is it a double underscore in '__services' ? 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" <gguardin@...> >> To: <users@...> >> 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. > |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsOn Mon, Jul 13, 2009 at 5:54 AM, Sergey Beryozkin <sberyozk@...>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" < >>> gguardin@...> >>> To: <users@...> >>> 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. >> >> > |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Gabriel
I'd like to ask you for one more favor and do a bit more debugging. here's what I did. Service class : @Path("/") public class WidgetsService { @GET @Path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}") public int getWidgetId(@PathParam("widgetID") Long widgetID, @PathParam("widgetType") Integer widgetType, @PathParam("size") Long containerSize, @PathParam("locale") String locale, @PathParam("properties") PathSegment props) { return 1; } } Client code : @Test public void testgetWidgetIdWithTwoMatrixParam() { WebClient wc = WebClient.create("http://localhost:9081/__services/bridging/widgets"); wc.accept("text/plain"); wc.path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}", 1, 2, 3, "en_US", "props").matrix("a", "b").matrix("c", "d"); int status = wc.get(Integer.class); assertEquals(1, status); } cxfservlet : /__services/* jaxrs:server/@address= "/bridging/widgets" It all works nicely, request URI looks like this : GET /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/en_US/props;a=b;c=d Would it be possible for you, whenever you get a chnace, to put 2 breakpoints, one in org.apache.cxf.transport.servlet.ServletController.getBaseURL(); and another one in JAXRSInInterceptor, on the line which reads String rawPath = HttpUtils.getPathToMatch(message, true); and let me know at what point of time '/__services/bridging/widgets/' gets in the way...Hopefully we can get to the botom of it :-) thanks, Sergey ----- Original Message ----- From: "Gabriel Guardincerri" <gguardin@...> To: <users@...> Sent: Monday, July 13, 2009 6:18 PM Subject: Re: Problem with matrix params, works with one, but not with two (or more) params > On Mon, Jul 13, 2009 at 5:54 AM, Sergey Beryozkin <sberyozk@...>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" < >>>> gguardin@...> >>>> To: <users@...> >>>> 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. >>> >>> >> > |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Sergey,
Sorry, I've just seen this post. I did that change, that as far as I can see is just to add "@Path("/")" to the class, but it didn't work. Anyway the problem seems to be here: private String getBaseURL(HttpServletRequest request) { String reqPrefix = request.getRequestURL().toString(); String pathInfo = request.getPathInfo() == null ? "" : request.getPathInfo(); //fix for CXF-898 if (!"/".equals(pathInfo) || reqPrefix.endsWith("/")) { // needs to be done given that pathInfo is decoded // TODO : it's unlikely servlet path will contain encoded values so we're most // likely safe however we need to ensure if it happens then this code works properly too reqPrefix = UrlUtils.pathDecode(reqPrefix); // pathInfo drops matrix parameters attached to a last path segment int offset = 0; int index = getMatrixParameterIndex(reqPrefix, pathInfo.length()); if (index >= pathInfo.length()) { offset = reqPrefix.length() - index; } reqPrefix = reqPrefix.substring(0, reqPrefix.length() - pathInfo.length() - offset); // MARK 1 } return reqPrefix; } private int getMatrixParameterIndex(String reqPrefix, int pathInfoLength) { int index = reqPrefix.lastIndexOf(';'); int lastIndex = -1; while (index >= pathInfoLength) { lastIndex = index; reqPrefix = reqPrefix.substring(0, index); index = reqPrefix.lastIndexOf(';'); } return lastIndex; } At "// MARK 1" the values are reqPrefix = http://localhost:8080/__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar pathInfo = /bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1 offset = 21 index = 101 And the result of executing that line is: reqPrefix = http://localhost:80 So there's the problem. On the other breakpoint rawPath = /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar And when I entered into "HttpUtils.getPathToMatch(message, true)" I get to: public static String getPathToMatch(String path, String address, boolean addSlash) { int ind = path.indexOf(address); if (ind == 0) { path = path.substring(ind + address.length()); } if (addSlash && !path.startsWith("/")) { path = "/" + path; } return path; } The value of "ind" is != 0, so it doesn't enter into the first if and the result is: path = /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar With one param the at the first breakpoint I get this reqPrefix = http://localhost:8080/__services pathInfo = /bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties And at the second one: It enters into the if since "ind == 0" and rawPath = /renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1 Hope this helps, Best, Gabriel On Tue, Jul 14, 2009 at 10:27 AM, Sergey Beryozkin <sberyozk@...>wrote: > Hi Gabriel > > I'd like to ask you for one more favor and do a bit more debugging. > > here's what I did. > > Service class : > > @Path("/") > > public class WidgetsService { > > > @GET > > > @Path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}") > > public int getWidgetId(@PathParam("widgetID") Long widgetID, > > @PathParam("widgetType") Integer widgetType, > > @PathParam("size") Long containerSize, > > @PathParam("locale") String locale, > > @PathParam("properties") PathSegment props) { > > return 1; > > } > > > > } > > > Client code : > > @Test > > public void testgetWidgetIdWithTwoMatrixParam() { > > WebClient wc = WebClient.create(" > http://localhost:9081/__services/bridging/widgets"); > > wc.accept("text/plain"); > > > wc.path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}", > > 1, 2, 3, "en_US", "props").matrix("a", "b").matrix("c", "d"); > > int status = wc.get(Integer.class); > > assertEquals(1, status); > > } > > cxfservlet : /__services/* > > jaxrs:server/@address= "/bridging/widgets" > > It all works nicely, request URI looks like this : > > GET > /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/en_US/props;a=b;c=d > > Would it be possible for you, whenever you get a chnace, to put 2 > breakpoints, one in > > org.apache.cxf.transport.servlet.ServletController.getBaseURL(); > > and another one in > > JAXRSInInterceptor, on the line which reads > > String rawPath = HttpUtils.getPathToMatch(message, true); > > and let me know at what point of time '/__services/bridging/widgets/' gets > in the way...Hopefully we can get to the botom of it :-) > > thanks, Sergey > > > > > > > > > > > > > ----- Original Message ----- From: "Gabriel Guardincerri" < > gguardin@...> > To: <users@...> > Sent: Monday, July 13, 2009 6:18 PM > Subject: Re: Problem with matrix params, works with one, but not with two > (or more) params > > > > On Mon, Jul 13, 2009 at 5:54 AM, Sergey Beryozkin <sberyozk@... >> >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" < >>>>> gguardin@...> >>>>> To: <users@...> >>>>> 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. >>>> >>>> >>>> >>> >> > |
|
|
Re: Problem with matrix params, works with one, but not with two (or more) paramsHi Gabriel
This is really helpful - thanks for spending your time on it. So let me clarify one thing. In the case when it does not work, when we have queries like http://localhost:8080/__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar you said that 'pathInfo' was equal to "__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1" ? The thing that the only place in that function where pathInfo gets initialized is here : > String pathInfo = request.getPathInfo() == null ? "" : So it appears it is HttpServletRequest drops the the last matrix parameter ? can you confirm it please ? thanks, Sergey > Hi Sergey, > Sorry, I've just seen this post. > > I did that change, that as far as I can see is just to add "@Path("/")" to > the class, but it didn't work. Anyway the problem seems to be here: > > private String getBaseURL(HttpServletRequest request) { > String reqPrefix = request.getRequestURL().toString(); > String pathInfo = request.getPathInfo() == null ? "" : > request.getPathInfo(); > //fix for CXF-898 > if (!"/".equals(pathInfo) || reqPrefix.endsWith("/")) { > // needs to be done given that pathInfo is decoded > // TODO : it's unlikely servlet path will contain encoded values > so we're most > // likely safe however we need to ensure if it happens then this > code works properly too > reqPrefix = UrlUtils.pathDecode(reqPrefix); > // pathInfo drops matrix parameters attached to a last path > segment > int offset = 0; > int index = getMatrixParameterIndex(reqPrefix, > pathInfo.length()); > if (index >= pathInfo.length()) { > offset = reqPrefix.length() - index; > } > reqPrefix = reqPrefix.substring(0, reqPrefix.length() - > pathInfo.length() - offset); // MARK 1 > } > return reqPrefix; > } > > private int getMatrixParameterIndex(String reqPrefix, int > pathInfoLength) { > int index = reqPrefix.lastIndexOf(';'); > int lastIndex = -1; > while (index >= pathInfoLength) { > lastIndex = index; > reqPrefix = reqPrefix.substring(0, index); > index = reqPrefix.lastIndexOf(';'); > } > return lastIndex; > } > > At "// MARK 1" the values are > > reqPrefix = > http://localhost:8080/__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar > pathInfo > = /bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1 > offset = 21 > index = 101 > > And the result of executing that line is: > > reqPrefix = http://localhost:80 > > So there's the problem. > > On the other breakpoint > > rawPath > = /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar > > And when I entered into "HttpUtils.getPathToMatch(message, true)" I get to: > > public static String getPathToMatch(String path, String address, boolean > addSlash) { > > int ind = path.indexOf(address); > if (ind == 0) { > path = path.substring(ind + address.length()); > } > if (addSlash && !path.startsWith("/")) { > path = "/" + path; > } > > return path; > } > > The value of "ind" is != 0, so it doesn't enter into the first if and the > result is: > > path > = /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1;foo=bar > > With one param the at the first breakpoint I get this > > reqPrefix = http://localhost:8080/__services > pathInfo > = /bridging/widgets/renderwidget/id/1/type/2/size/3/locale/4/properties > > And at the second one: > > It enters into the if since "ind == 0" and > > rawPath = /renderwidget/id/1/type/2/size/3/locale/4/properties;numResults=1 > > Hope this helps, > > Best, > > Gabriel > > On Tue, Jul 14, 2009 at 10:27 AM, Sergey Beryozkin <sberyozk@...>wrote: > >> Hi Gabriel >> >> I'd like to ask you for one more favor and do a bit more debugging. >> >> here's what I did. >> >> Service class : >> >> @Path("/") >> >> public class WidgetsService { >> >> >> @GET >> >> >> @Path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}") >> >> public int getWidgetId(@PathParam("widgetID") Long widgetID, >> >> @PathParam("widgetType") Integer widgetType, >> >> @PathParam("size") Long containerSize, >> >> @PathParam("locale") String locale, >> >> @PathParam("properties") PathSegment props) { >> >> return 1; >> >> } >> >> >> >> } >> >> >> Client code : >> >> @Test >> >> public void testgetWidgetIdWithTwoMatrixParam() { >> >> WebClient wc = WebClient.create(" >> http://localhost:9081/__services/bridging/widgets"); >> >> wc.accept("text/plain"); >> >> >> wc.path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}", >> >> 1, 2, 3, "en_US", "props").matrix("a", "b").matrix("c", "d"); >> >> int status = wc.get(Integer.class); >> >> assertEquals(1, status); >> >> } >> >> cxfservlet : /__services/* >> >> jaxrs:server/@address= "/bridging/widgets" >> >> It all works nicely, request URI looks like this : >> >> GET >> /__services/bridging/widgets/renderwidget/id/1/type/2/size/3/locale/en_US/props;a=b;c=d >> >> Would it be possible for you, whenever you get a chnace, to put 2 >> breakpoints, one in >> >> org.apache.cxf.transport.servlet.ServletController.getBaseURL(); >> >> and another one in >> >> JAXRSInInterceptor, on the line which reads >> >> String rawPath = HttpUtils.getPathToMatch(message, true); >> >> and let me know at what point of time '/__services/bridging/widgets/' gets >> in the way...Hopefully we can get to the botom of it :-) >> >> thanks, Sergey >> >> >> >> >> >> >> >> >> >> >> >> >> ----- Original Message ----- From: "Gabriel Guardincerri" < >> gguardin@...> >> To: <users@...> >> Sent: Monday, July 13, 2009 6:18 PM >> Subject: Re: Problem with matrix params, works with one, but not with two >> (or more) params >> >> >> >> On Mon, Jul 13, 2009 at 5:54 AM, Sergey Beryozkin <sberyozk@... >>> >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" < >>>>>> gguardin@...> >>>>>> To: <users@...> >>>>>> 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. >>>>> >>>>> >>>>> >>>> >>> >> > |
| Free embeddable forum powered by Nabble | Forum Help |