2013-07-02 2 views
2

Несмотря на то, как утверждают here:TomEE 1.5.2 @Path аннотацию на уровне интерфейса до сих пор не работает

для приложений, которые не работают из-за недостающего @Path на уровне класса -> он должен теперь работать

Мне до сих пор приходится комментировать мои конечные реализации, поскольку аннотации на интерфейсах не собираются.

Связано ли это с тем, как я настраиваю JAX-RS, или это ошибка, присутствующая в TomEE?

интерфейс:

@Path("myPath") public interface MyEndpoint { 

    @Path("{id}") String getById(@PathParam("id") long id); 

} 

реализация:

@Stateless class EJBBackedMyEndpoint implements MyEndpoint { 

    String getById(long id) { return "foo"; } 
} 

OpenEJB-jar.xml

<openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1"> 
    <ejb-deployment ejb-name="EJBBackedMyEndpoint"> 
     <properties>cxf.jaxrs.providers = exceptionMapper</properties> 
    </ejb-deployment> 
    </openejb-jar> 

resources.xml

<resources> 
    <Service id="exceptionMapper" class-name="package.MyExceptionMapper"/> 
</resources> 

beans.xml присутствует только с пустым корневым элементом

Update:

  • JAX-RS Spec, по-видимому, не говоря уже о аннотациях уровня класса на всех
  • @Consumes и @Produces работе, когда применяется на интерфейсе,
  • @Path (уровень класса) не работает, если применяется к интерфейсу,
  • @Path на уровне метода соблюдается при запросах маршрутизации, однако UriBuilder не работает ing: UriBuilder.path(EJBBackedMyEndpoint.class, "getById") throws IllegalArgumentException: No Path annotation for 'retrieve' method.

ответ

2

Этот пост в блоге, возможно, вводит в заблуждение. Помещение @Path, @GET, @PathParam или другие аннотации JAX-RS на интерфейс не поддерживаются JAX-RS. В каждой спецификации все они должны находиться в «классе ресурсов», который является классом bean @Stateless в этой ситуации.

Если вы переместите @Path из интерфейса в класс bean, он должен работать. По крайней мере, он должен идти дальше.

+1

Я помню, что это сработало для меня, когда я использовал простой CXF. Не могли бы вы указать мне на соответствующую часть спецификации? –

+0

Похоже, я ошибаюсь, по крайней мере, в части ответа. Раздел «3.6 Наследование аннотаций» JAX-RS 1.1 говорит, что вы определенно можете добавлять аннотации к методу интерфейса. В нем упоминаются только методы, а в примере spec все еще есть аннотация @bot в классе bean. Я прошел через TCK (набор тестов совместимости), и есть тесты, которые имеют интерфейсы с аннотированными методами, но никаких тестов с интерфейсом с использованием аннотаций вне методов. Мы передаем TCK для JAXRS, чтобы это работало. Но не кажется, что аннотации к не-методам интерфейса покрываются спецификацией или TCK. –

+0

После тщательного чтения я думаю, что в разделе 3.6 не упоминаются аннотации уровня класса. Тем не менее, я думаю, что CXF позволяет это, поэтому, возможно, я был просто неаккуратен и оставил некоторые другие комментарии к классу. –

Смежные вопросы