Search code examples
javacxfjax-rsapache-tomeejettison

JSON deserialize only with at least 2 parameters


I'm implementing a RESTful service application for TomEE Plus 1.7.1 with Jettison as default json provider. I have several facade classes for my entitiy classes to provide CRUD functionalities for each of them. Service facades have been generated by netbeans.

This is the POST method:

@POST
public void create(Course entity) {
    super.create(entity);
}

While using this method (to create a new instance in the database) I got following error:

No message body reader has been found for request class Object, ContentType : application/json.

After several hours of trying, I got it to work: I only had to add another parameter to the method, like that:

@POST
public void create(@Context Context uriInfo, Course entity) {
    super.create(entity);
}

I don't understand why I had to add this Context parameter. I don't need the context variable, so actually I would like to remove it...

Does anybody know the reason?


Solution

  • Okay, I think I found the solution:

    All my rest services have been implemented as facade classes. The abstract facade (super class of all services) has several methods like:

    public void create(T entity) { getEntityManager().persist(entity); }
    public void edit(T entity) {getEntityManager().merge(entity);}
    

    These methods are used by the facade classes:

    public void create(Course entity) {
        super.create(entity);
    }
    
    public void edit(@PathParam("id") Integer id, Course entity) {
        super.edit(entity);
    }
    

    (for better viewing I've removed the annotations here)

    The difference between these two methods is, that the edit method has a second parameter "id" and so does not override the edit() method of the super class. But the create() method does only have a single parameter which causes override of the super class method "create()". I don't know why, but cxf is now creating two endpoints:

    POST http://localhost:8080/webprog/api/course/  ->      void create(Course)           
    
    POST http://localhost:8080/webprog/api/course/  ->      void create(Object)         
    

    This is also the reason why I got it working with a secon parameter: The create() method is not getting overriden anymore.

    So what i did now, is simply renaming the method in de super class, to not override them in the facade classes.

    by the way: all services classes have been created by netbeans generator... maybe there is a bug in it