Search code examples
javajsonhibernatejerseygenson

Genson not consuming Hibernate POJO's field annotated with @Transient


For implementing a REST API in Java, I'm using: - Jersey JAX-RS Framework - Genson parser - Tomcat8 server - Hibernate

I have this method in a service class:

@POST
@Consumes("application/json")
public Response createUser(Users user) {
    UsersDAO u = new UsersDAO();

    if(user.getLogin() == null || user.getPasswd() == null)
        return Response.status(Response.Status.BAD_REQUEST).entity("Missing information").build();
    try{
        u.addUser(user);
    }catch(HibernateException e){
        return Response.status(Response.Status.BAD_REQUEST).entity("User already exists").build();
    }
    return Response.status(Response.Status.CREATED).build();
}

The Users class:

public class Users implements Serializable {

    @Basic(optional = false)
    @Column(name = "passwd")
    private String passwd;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "iduser")
    private Integer idUser;

    @Basic(optional = false)
    @Column(name = "login")
    private String login;

    @JoinColumn(name = "idusersgroup", referencedColumnName = "idusersgroup")
    @ManyToOne(optional = true)
    private UsersGroups idUsersGroup;

    @Transient
    private int idGroup;

    .
    .
    .
}

As you can see, I created the idGroup field just to store the id of the UsersGroups object related, so if I want to add the group in the moment of the user creation, I'll just have to include its id in the JSON instead of the UsersGroups object (the relationship is optional, a user can belong to a group or not). The problem is Genson is not adding this field to the Users object when consumes the JSON:

{
"login": "admin1",
"passwd": "12345",
"idgroup": 3
} 

If I POST this JSON and then access to the user.getIdGroup(), it returns 0, so I assume that idGroup field isn't being consumed. Could the @Transient annotation has something to do with this issue? Any idea on how to solve it? If the problem is Genson and there's any solution using another JSON parser (like Jackson), I could consider a switch


Solution

  • The issue is that in the json you have idgroup with lowercase while the property in the class is with upper case G. Also make sure you have getters and setters for it or configure Genson to use private properties (you can find a few examples in the docs).

    BTW genson is not aware of hibernate annotations.