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