cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: ParameterHandler for a Long array
Date Wed, 10 Mar 2010 18:40:16 GMT
Hi Robert

Apologies it took me so long to reply :-), only today I had a chance to look
into this issue.
What happens is that it is JAXRS the spec which is partially 'interfering'.
Basically, when one says

@QueryParam("id") List<Long> ids

what it means is that queries like
?id=1&id=2&id=3

are expected to be deal with with the list (in this example) containing 1,
2, 3 (and similarly for Set). I've also added a support for arrays like
Long[].

Thus, when the runtime sees

@QueryParam("id") List<Long> ids
or
@QueryParam("id") Long[] ids

it is parsing a query string into a usual name/value pairs and then tries to
convert each *individual* value of matching pairs (with the name equal to
'id' in this example) into Long (in this example), thus
ParameterHandler<Long[]> will not be checked.

It is only the case for collections/arrays where ParameterHandlers are not
visible.

So given the above and that you'd like this format be accepted :

>> /getEffectiveBid?offerIds=1;2;3;4

then what you might want to do, instead of registering a custom
ParameterHandler, is to register a custom RequestHandler input filter which
will overwrite a Message.QUERY_STRING Message property :

String query = (String)message.get(Message.QUERY_STRING);
if (query != null) {
    String[] pair = query.split("=");
    if (pair[0].equals("offerIds")) {
        String[] ids = pair[1].split(";");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < ids.length; i++) {
            sb.append(pair[0]).append("=").append(ids[i]);
            if (i + 1 < ids.length) {
                sb.append("&");
            }
        }
        message.put(Message.QUERY_STRING, sb.toString());
    }
}

this will let you to have signatures like

@QueryParam("id") Long[] ids

and queries like

/getEffectiveBid?offerIds=1;2;3;4

at a fairly low cost

hope it helps, Sergey


On Mon, Mar 8, 2010 at 10:54 PM, Robert Roland <rroland@shopzilla.com>wrote:

>
> Hi Sergey,
>
> Thanks for replying so quickly!
>
> It seems to do the same with List<Long> - my ParameterHandler is never
> called.
>
> I'm using CXF 2.2.6.  If you need any additional detail, I can email you
> off
> list so I'm not putting large chunks of code on the mailing list.
>
> Thanks much,
>
> Rob
>
>
> Sergey Beryozkin-5 wrote:
> >
> > Hi Rob
> >
> > Perhaps there's a big in ProviderFactory to do with finding
> > ParameterHandler
> > parameterized with array classes like Long[]...I'll look into it, in
> > meantime you might want to try List<Long> instead...
> >
> > cheers, Sergey
> >
> > On Mon, Mar 8, 2010 at 7:47 PM, Robert Roland <rroland@shopzilla.com>
> > wrote:
> >
> >>
> >> Hi all,
> >>
> >> I'm attempting to make my service accept a URL like:
> >>
> >> /getEffectiveBid?offerIds=1;2;3;4
> >>
> >> I know that I can use a Long[] for a URL like:
> >>
> >> /getEffectiveBid?offerIds=1&offerIds=2&offerIds=3
> >>
> >> However - this URL format is not acceptable.  I want to support a
> >> semicolon
> >> delimited list.
> >>
> >> I've tried registering a ParameterHandler:
> >>
> >>    <jaxrs:providers>
> >>      <bean
> >>
> class="com.shopzilla.ms.bidding.service.util.LongArrayParameterHandler"/>
> >>    </jaxrs:providers>
> >>
> >> My method looks like this:
> >>
> >>    @Override
> >>    @Path("getEffectiveBid")
> >>    @Produces( { MediaType.APPLICATION_XML, "application/fastinfoset",
> >> MediaType.APPLICATION_JSON })
> >>    @GET
> >>    public GetEffectiveBidResponse
> getEffectiveBid(@QueryParam("offerIds")
> >> Long[] offerIds) throws Exception {
> >>
> >> My ParameterHandler is never called, and I get the following error:
> >>
> >> Mar 8, 2010 11:45:29 AM org.apache.cxf.jaxrs.utils.InjectionUtils
> >> handleParameter
> >> SEVERE: Class java.lang.Long can not be instantiated using a constructor
> >> with a single String argument
> >>
> >> How do I do this?  I've tried looking at the mailing lists, but it seems
> >> everyone gives up and uses a String parameter, which just seems...
> dirty.
> >> :)
> >>
> >> Thanks much for your help,
> >>
> >> Rob
> >> --
> >> View this message in context:
> >>
> http://old.nabble.com/ParameterHandler-for-a-Long-array-tp27826543p27826543.html
> >> Sent from the cxf-user mailing list archive at Nabble.com.
> >>
> >>
> >
> >
>
> --
> View this message in context:
> http://old.nabble.com/ParameterHandler-for-a-Long-array-tp27826543p27828936.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message