Reputation: 851
I've faced the problem, which is a little bit close to this issue, but when I've done all the steps, i still have such an exception:
org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[0]->com.myPackage.SomeEntity["mainEntity"]->com.myPackage.MainEntity["subentity1"]->com.myPackage.Subentity1_$$_javassist_8["handler"])
here is code with my entities:
@JsonAutoDetect
public class MainEntity {
private Subentity1 subentity1;
private Subentity2 subentity2;
@JsonProperty
public Subentity1 getSubentity1() {
return subentity1;
}
public void setSubentity1(Subentity1 subentity1) {
this.subentity1 = subentity1;
}
@JsonProperty
public Subentity2 getSubentity2() {
return subentity2;
}
public void setSubentity2(Subentity2 subentity2) {
this.subentity2 = subentity2;
}
}
@Entity
@Table(name = "subentity1")
@JsonAutoDetect
public class Subentity1 {
@Id
@Column(name = "subentity1_id")
@GeneratedValue
private Long id;
@Column(name = "name", length = 100)
private String name;
@JsonIgnore
@OneToMany(mappedBy = "subentity1")
private List<Subentity2> subentities2;
@JsonProperty
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@JsonProperty
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//here I didin't add @JsonProperty, cause it leads to cycling during serialization
public List<Subentity2> getSubentity2s() {
return subentity2s;
}
public void setSubentity2s(List<Subentity2> subentity2s) {
this.subentity2s = subentity2s;
}
}
@Entity
@Table(name = "subentity2")
@JsonAutoDetect
public class Subentity2 {
@Id
@Column(name = "subentity2_id")
@GeneratedValue
private Long id;
@Column(name = "name", length = 50)
private String name;
@ManyToOne
@JoinColumn(name = "subentity1_id")
private Subentity1 subentity1;
@JsonProperty
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@JsonProperty
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonProperty
public Subentity1 getSubentity1() {
return subentity1;
}
public void setSubentity1(Subentity1 subentity1) {
this.subentity1 = subentity1;
}
here is code of my method for transformation:
private String toJSON(Object model) {
ObjectMapper mapper = new ObjectMapper();
String result = "";
try {
result = mapper.writeValueAsString(model);
} catch (JsonGenerationException e) {
LOG.error(e.getMessage(), e);
} catch (JsonMappingException e) {
LOG.error(e.getMessage(), e);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
return result;
}
I'll very grateful for any help, pieces of advice or code :)
UPD
alsp, I forgot to add piece of code from my controller:
String result = "";
List<SomeEntity> entities = someEntityService.getAll();
Hibernate.initialize(entities);
for (SomeEntity someEntity : entities) {
Hibernate.initialize(someEntity.mainEntity());
Hibernate.initialize(someEntity.mainEntity().subentity1());
Hibernate.initialize(someEntity.mainEntity().subentity2());
}
result = this.toJSON(entities);
I can't ignore any fields, cause I need them
Upvotes: 0
Views: 5654
Reputation: 1321
If you are using lazy loading add this
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Upvotes: 0
Reputation: 851
I created a Bean with plane fields(String, Boolean, Double, etc.), which are in my classes and made method for transformation
Upvotes: 0
Reputation: 10171
Basically some of your fields are wrapped into lazy hibernate proxies.
Call Hibernate.initialize(model)
before serializing your object, it will load your lazy collections and references.
But I would not mix database and view models, this is a bad practice. Create set of classes for your restful model and convert database entities to them before serialization.
Upvotes: 1