Problem with matrix params, works with one, but not with two (or more) params

View: New views
14 Messages — Rating Filter:   Alert me  

Problem with matrix params, works with one, but not with two (or more) params

by Gabriel Guardincerri :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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.

Re: Problem with matrix params, works with one, but not with two (or more) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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:
> /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.
>


Parent Message unknown Re: Problem with matrix params, works with one, but not with two (or more) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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 two (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:
>> /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) params

by Gabriel Guardincerri :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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@progress.com>
To: <users@cxf.apache.org>
Sent: Thursday, July 02, 2009 11:00 AM
Subject: Re: Problem with matrix params, works with one, but not with two (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@gmail.com>
> To: <users@cxf.apache.org>
> 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) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi 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
two
> (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:
>>>
/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-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) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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.
>


Re: Problem with matrix params, works with one, but not with two (or more) params

by Gabriel Guardincerri :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi Sergey,

Sorry for the delay, sure, I'll try it. I'm on holidays now, but I can do it on Monday.

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@gmail.com>
To: <users@cxf.apache.org>
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) params

by Gabriel Guardincerri :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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@gmail.com>
To: <users@cxf.apache.org>
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) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi 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) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi 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) params

by Gabriel Guardincerri :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

by Gabriel Guardincerri :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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.
>>>>
>>>>
>>>>
>>>
>>
>

Re: Problem with matrix params, works with one, but not with two (or more) params

by Sergey Beryozkin-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi 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.
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>