Hi Sergei,

> The bottom line though, the selection is unpredictable in this case.
> 
> I think you have a couple of options:
> - use CXF ResourceComparator to customize the selection further, Jan wrote
> the implementation for selecting the methods based on a number of query
> parameters, etc...

That makes sense - thinking how to refactor these methods in best way.

Thanks a lot!

Andrei.

> -----Original Message-----
> From: Sergey Beryozkin [mailto:[email protected]]
> Sent: Freitag, 8. Februar 2013 16:55
> To: [email protected]
> Subject: Re: [JAXRS] Mathing resource method based on empty/non-empty
> body
> 
> Hi,
> On 08/02/13 15:26, Andrei Shakirin wrote:
> > Hi,
> >
> > Use case: there is JAXRS service interface containing two POST methods:
> >
> >                      @POST
> >                      @Path("{userId}/status")
> >                      Customer activate(@PathParam("userId") long
> > userId, @QueryParam("token") String token);
> >
> >                      @POST
> >                      @Path("{userId}/status")
> >                      Customer activate(@PathParam("userId") long userId,
> @QueryParam("token") String token,
> >                                                  SyncPolicyTO
> > policyTO);
> >
> > Both methods have the same URL, the difference is just that the first one
> expects no request body and the second one expects policyTO object in the
> request body.
> > Question: is it basically possible for runtime to match resource method
> based on this criteria?
> > I didn't find explicit statement regarding it in the JAXRS spec.
> 
> JAX-RS selection algorithm does not take the method parameters into
> consideration, so the selection is random
> 
> > Currently for CXF:
> >
> > a)      In case if method has @QueryParam, I always receive either
> BadRequest error from the service by call activate()
> >
> 
> I guess when you have @QueryParam (the extra Java method parameter),
> JRE will list the method with SyncPolicyTo first and hence JAX-RS runtime
> selects it first, and then, assuming SyncPolicyTO is JAXB bean, it is the job 
> of
> JAXB provider to populate it and it will throw 400 if the actual message body
> from which SyncPolicyTO is to be populated is empty, this 400 is per the spec
> 
> > b)      If method has no @QueryParam, the first method is always called
> > Looks a little bit strange for me.
> >
> I guess in this case the runtime lists the former method first.
> 
> The bottom line though, the selection is unpredictable in this case.
> 
> I think you have a couple of options:
> - use CXF ResourceComparator to customize the selection further, Jan wrote
> the implementation for selecting the methods based on a number of query
> parameters, etc...
> - use only a single method,
> 
> Customer activate(@PathParam("userId") long userId, QueryParam("token")
> String token, SyncPolicyTO policyTO);
> 
> and add org.apache.cxf.jaxrs.ext.Nullable annotation to SyncPolicyTO, if the
> payload is not empty - then SyncPolicyTO will be populated, otherwise, if
> @Nullable is there, null will be injected
> 
> HTH, Sergey
> 
> > Any ideas how it should work?
> >
> > Regards,
> > Andrei.
> >
> 

Reply via email to