cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Beryozkin (JIRA)" <>
Subject [jira] [Commented] (CXF-6078) AnnotationUtils.getAnnotatedMethod for abstract classes not inherit from interface
Date Mon, 03 Nov 2014 14:15:34 GMT


Sergey Beryozkin commented on CXF-6078:

Hi, this issue is probably invalid...
JAX-RS annotation inheritance is quite specific, it does not support the overriding of annotations
and abstract classes are preferred to interfaces in the search order, see

> AnnotationUtils.getAnnotatedMethod for abstract classes not inherit from interface
> ----------------------------------------------------------------------------------
>                 Key: CXF-6078
>                 URL:
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 2.7.13
>            Reporter: Alexander Shvid
>         Attachments:,,,
> I created the special junit test to demonstrate this bug.
> Suppose we have NameService with annotated methods: 'get' and 'set'.
> NameServiceImpl that implements NameService and only 'get' method.
> AbstractNameServiceImpl that implements 'set' method. 
> NameServiceImpl extends AbstractNameServiceImpl.
> AbstractNameServiceImpl does not implement NameService.
> For this case AnnotationUtils.getAnnotatedMethod returns wrong annotatedMethod for 'set'.
It is actually same method as requested one, but not the 'set' method from the interface.
> m = public NameServiceImpl.get(java.lang.String)
> a = public abstract NameService.get(java.lang.String)
> m = public AbstractNameServiceImpl.set(java.lang.String)
> a = public AbstractNameServiceImpl.set(java.lang.String)
> JDK1.7.0_51
> It happens because AnnotationUtils.getAnnotatedMethod has only single argument Method,
that is the method 'set' from super class AbstractNameServiceImpl. It does not have information
about NameServiceImpl itself and does not check hierarchy of the NameServiceImpl as well.
In fact, logically it checks superclass AbstractNameServiceImpl only, but really we are using
NameServiceImpl as a service class. This is the bug.
> Solution:
> AnnotationUtils.getAnnotatedMethod needs additional Class<?> serviceClass argument
to check hierarchy of service class to find annotated method, that's because Method argument
can be from any level of super class of the serviceClass and there is no guarantee that it
implements base RESTful interface with annotated methods.
> It actually affects ResourceUtils.createClassResourceInfo
> that calls AnnotationUtils.getAnnotatedMethod to detect annotated method in the loop
>     private static void evaluateResourceClass(ClassResourceInfo cri, boolean enableStatic)
>         MethodDispatcher md = new MethodDispatcher();
>         for (Method m : cri.getServiceClass().getMethods()) {
>             Method annotatedMethod = AnnotationUtils.getAnnotatedMethod(m);
> It knows about ServiceClass, but does not use this information to walk in classes hierarchy.
> For me, this bug leads to the situation that not all methods have mapping in the application.

This message was sent by Atlassian JIRA

View raw message