jsr370-experts@jax-rs-spec.java.net

Re: Default for missing _at_Path

From: <markus_at_headcrashing.eu>
Date: Tue, 01 Mar 2016 18:34:09 +0100

We tried it today and Jersey does neither complain when deploying a
@Path-free root resource, nor does the app look any different in the
GlassFish admin console compared to a @Path-annotated resource.

So what I actually expect at this point in the discussion is a clear
answer from the spec leads WHETHER this is a bug of Jersey AND the
spec MUST say that a root resource MUST have @Path, OR that the spec
MUST say HOW Jersey / CXF / RestEasy MUST work like in case of
@Path-free root resources.

-Markus

Zitat von Sergey Beryozkin <sberyozkin_at_talend.com>:

> If Jersey treats non-Path annotated resources as root resources then
> it is a bug.
> There was a long discussion in the early days and it was insisted by
> the original spec leads the roots must have @Paths.
>
> Cheers, Sergey
>
> On 01/03/16 17:00, markus_at_headcrashing.eu wrote:
>> Bill,
>>
>> no I did not miss that example. But -as many specs do- I assume
>> that examples are non-normative but solely illustrative.
>>
>> Actually neither the spec nor the JavaDocs explicitly say that root
>> resources MUST have @Path. In fact, Jersey deploys a root resource
>> WITHOUT having @Path. That's the actual reason why I am asking:
>> What DOES Jersey do in that case (it does NOT complain at least),
>> and how MUST a JAX-RS implementation deal with @Path-free root
>> resources?
>>
>> In fact I don't understand why we cannot simply add a short line to
>> the spec instead of discussion: "An un-annotated root resource
>> class MUST be treated as if @Path("") would be existing at the
>> class". That would be unambiguously make clear how Jersey, RestEasy
>> and CXF MUST deal with that case.
>>
>> -Markus
>>
>>
>> Zitat von Bill Burke <bburke_at_redhat.com>:
>>
>>> FYI: Root resource classes require a class level @Path annotation.
>>> Maybe you missed the end of the Javadoc where it gives
>>> http://example.com/catalogue/widgets and
>>> http://example.com/catalogue/widgets/nnn as an example?
>>>
>>> On 2/29/2016 1:46 PM, markus_at_headcrashing.eu wrote:
>>>> Bill,
>>>>
>>>> no need to imply that I did not read the Javadocs -- I did
>>>> several times before asking.
>>>>
>>>> Here is the full JavaDoc of @Path annotation as of v2.0. Please
>>>> tell me where it says what Jersey will do in case no @Path is
>>>> found anywhere in a JAX-RS resource class (yes, it talks about
>>>> base URIs, but it does not say that the default for the
>>>> annotation's value must be "/" or "" which is possibly what you
>>>> imply and which is NOT what Jersey does). BTW, it DOES need
>>>> explanation as I was asked that very question several times, so
>>>> it is everything but unambiguous for others:
>>>>
>>>> @Target(value={TYPE,METHOD})
>>>> @Retention(value=RUNTIME)
>>>> @Documented
>>>> public @interface Path
>>>> Identifies the URI path that a resource class or class method
>>>> will serve requests for.
>>>> Paths are relative. For an annotated class the base URI is the
>>>> application path, see ApplicationPath. For an annotated method
>>>> the base URI is the effective URI of the containing class. For
>>>> the purposes of absolutizing a path against the base URI , a
>>>> leading '/' in a path is ignored and base URIs are treated as if
>>>> they ended in '/'. E.g.:
>>>>
>>>> @Path("widgets")
>>>> public class WidgetsResource {
>>>> @GET
>>>> String getList() {...}
>>>>
>>>> @GET @Path("{id}")
>>>> String getWidget(@PathParam("id") String id) {...}
>>>> }
>>>> In the above, if the application path is catalogue and the
>>>> application is deployed at http://example.com/, then GET requests
>>>> for http://example.com/catalogue/widgets will be handled by the
>>>> getList method while requests for
>>>> http://example.com/catalogue/widgets/nnn (where nnn is some
>>>> value) will be handled by the getWidget method. The same would
>>>> apply if the value of either @Path annotation started with '/'.
>>>>
>>>> Classes and methods may also be annotated with Consumes and
>>>> Produces to filter the requests they will receive.
>>>>
>>>> -Markus
>>>>
>>>>> Go read the Javadoc for @Path. It is explained there and IMO,
>>>>> needs no further explanation.
>>>>>
>>>>>
>>>>> On 2/29/2016 12:32 PM, markus_at_headcrashing.eu wrote:
>>>>>> According to the current wording of the JAX-RS 2.0
>>>>>> specification, a compliant JAX-RS resource class not
>>>>>> necessarily must have a @Path annotation (it is enough to have
>>>>>> @GET for example). Maybe I am blind, but I cannot see an
>>>>>> explanation what the default path shall be in case no @Path is
>>>>>> found. So my question is:
>>>>>>
>>>>>> How do Jersey / CXF / RestEasy handle this case currently, and
>>>>>> won't it be a good idea if we add a short note to the JAX-RS
>>>>>> 2.1 spec how it SHALL be like?
>>>>>>
>>>>>> -Markus
>>>>
>>>>
>>>
>>> --
>>> Bill Burke
>>> JBoss, a division of Red Hat
>>> http://bill.burkecentral.com
>>
>>
>>