Hi Jarmo,
Currently you will need to move the annotations to the implementing
class, or modify the generic interfaces to be classes that implement
the generic methods.
This issue is little tricky to fix, but on investigation i think i can
fix it. Can you log an issue?
To find the inherited method one needs to search through all the
methods on the super class or interface for those methods with the
same method name and same number of parameters as the inheriting
method then compare generic parameter types of the inheriting and
inherited methods. Unfortunately the JDK comes with very little help
reflection wise for generics. :-(
Paul.
On Dec 17, 2009, at 11:53 AM, Jarmo Torvinen wrote:
> Hi,
>
> I have:
>
> @MappedSuperclass
> @XmlRootElement
> @XmlAccessorType(XmlAccessType.FIELD)
> public abstract class AbstractObject implements Serializable {
> ...
> }
>
> @XmlRootElement(name = "Car")
> @XmlAccessorType(XmlAccessType.FIELD)
> public class Car extends AbstractObject {
> ...
> }
>
> public interface CrudRestService<T extends AbstractObject> {
>
> @POST
> @Produces(MediaType.APPLICATION_JSON)
> @Consumes(MediaType.APPLICATION_JSON)
> public T create(T newObject);
>
> @GET
> @Path("{id}")
> @Produces(MediaType.APPLICATION_JSON)
> @Consumes(MediaType.APPLICATION_JSON)
> public T read(@PathParam("id") long id);
>
> ...(same for update and delete)
>
> }
>
> public interface CarService extends CrudRestService<Car> {
>
> }
>
>
> @Path("/cars")
> public class CarWebService implements CarService {
>
> public Car create(Car newObject) {
>
> return new Car(newObject);
>
> }
>
> public Car read(long id) {
>
> return findCarById(id);
> }
>
>
> }
>
> Now, what is happening in real life: the read() function with
> GET-method works, but the create() method with POST is not working,
> instead, a 405 not allowed is returned.
>
> I traced the issue to AnnotatedMethod.findAnnotatedMethod() call:
>
> try {
> m = c.getMethod(m.getName(), m.getParameterTypes());
> } catch (NoSuchMethodException ex) {
> return null;
> }
>
> When this is called on a interface that uses generics, the function
> parameters are not matched and so the annotated method is not
> discovered. Are there any options to get this fixed or do I just need
> to move the annotations to the implementation class?
>
>
>
> --
> Jarmo
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>