Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No serializer found for class org.hibernate.proxy.pojo.javassist.Javassist?

I am working on SpringMVC, Hibernate & JSON but I am getting this error.

HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) )  

Please check my Entity below

    @Entity @Table(name="USERS") public class User {      @Id     @GeneratedValue     @Column(name="USER_ID")     private Integer userId;      @Column(name="USER_FIRST_NAME")     private String firstName;      @Column(name="USER_LAST_NAME")     private String lastName;       @Column(name="USER_MIDDLE_NAME")     private String middleName;      @Column(name="USER_EMAIL_ID")     private String emailId;      @Column(name="USER_PHONE_NO")     private Integer phoneNo;      @Column(name="USER_PASSWORD")     private String password;      @Column(name="USER_CONF_PASSWORD")     private String  confPassword;      @Transient     private String token;      @Column(name="USER_CREATED_ON")     private Date createdOn;      @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)     @Fetch(value = FetchMode.SUBSELECT)     @JoinTable(name = "USER_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })     private List<ActifioRoles> userRole = new ArrayList<ActifioRoles>();       @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="userDetails")     @Fetch(value = FetchMode.SUBSELECT)     private List<com.actifio.domain.Address> userAddress = new ArrayList<com.actifio.domain.Address>();      @OneToOne(cascade=CascadeType.ALL)     private Tenant tenantDetails;       public Integer getUserId() {         return userId;     }     public void setUserId(Integer userId) {         this.userId = userId;     }     public String getFirstName() {         return firstName;     }     public void setFirstName(String firstName) {         this.firstName = firstName;     }     public String getLastName() {         return lastName;     }     public void setLastName(String lastName) {         this.lastName = lastName;     }     public String getEmailId() {         return emailId;     }     public void setEmailId(String emailId) {         this.emailId = emailId;     }     public String getPassword() {         return password;     }     public void setPassword(String password) {         this.password = password;     }     public String getConfPassword() {         return confPassword;     }     public void setConfPassword(String confPassword) {         this.confPassword = confPassword;     }     public Date getCreatedOn() {         return createdOn;     }     public void setCreatedOn(Date createdOn) {         this.createdOn = createdOn;     }      public List<ActifioRoles> getUserRole() {         return userRole;     }      public void setUserRole(List<ActifioRoles> userRole) {         this.userRole = userRole;     }     public String getMiddleName() {         return middleName;     }     public void setMiddleName(String middleName) {         this.middleName = middleName;     }     public Integer getPhoneNo() {         return phoneNo;     }     public void setPhoneNo(Integer phoneNo) {         this.phoneNo = phoneNo;     }      public List<com.actifio.domain.Address> getUserAddress() {         return userAddress;     }     public void setUserAddress(List<com.actifio.domain.Address> userAddress) {         this.userAddress = userAddress;     }     public Tenant getTenantDetails() {         return tenantDetails;     }     public void setTenantDetails(Tenant tenantDetails) {         this.tenantDetails = tenantDetails;     }     public String getToken() {         return token;     }     public void setToken(String token) {         this.token = token;     }      } 

How can I Solve this?

like image 883
user2963481 Avatar asked Jul 28 '14 11:07

user2963481


2 Answers

I had a similar problem with lazy loading via the hibernate proxy object. Got around it by annotating the class having lazy loaded private properties with:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 

I assume you can add the properties on your proxy object that breaks the JSON serialization to that annotation.

The problem is that entities are loaded lazily and serialization happens before they get loaded fully.

Hibernate.initialize(<your getter method>); 
like image 110
Ankur Singhal Avatar answered Oct 09 '22 13:10

Ankur Singhal


Just to add this in, I ran into this same issue, but the supplied answers did not work. I fixed it by taking the exception's suggestion and adding to the application.properties file...

spring.jackson.serialization.fail-on-empty-beans=false 

I'm using Spring Boot v1.3 with Hibernate 4.3

It now serializes the entire object and nested objects.

EDIT: 2018

Since this still gets comments I'll clarify here. This absolutely only hides the error. The performance implications are there. At the time, I needed something to deliver and work on it later (which I did via not using spring anymore). So yes, listen to someone else if you really want to solve the issue. If you just want it gone for now go ahead and use this answer. It's a terrible idea, but heck, might work for you. For the record, never had a crash or issue again after this. But it is probably the source of what ended up being a SQL performance nightmare.

like image 44
CP510 Avatar answered Oct 09 '22 13:10

CP510