[英]Jackson & JSONAnySetter: NullPointer Exception during Serialization/Deserialization
[英]Jackson exception during serialization
我已经遇到了这个问题 , 这个问题与这个问题有点接近,但是当我完成所有步骤后,我仍然有一个例外:
org.codehaus.jackson.map.JsonMappingException:未找到类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer的序列化器,也未发现创建BeanSerializer的属性(为避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))(通过引用链) :java.util.ArrayList [0]-> com.myPackage.SomeEntity [“ mainEntity”]-> com.myPackage.MainEntity [“ subentity1”]-> com.myPackage.Subentity1 _ $$ _ javassist_8 [“ handler”]))
这是我的实体的代码:
@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;
}
这是我的转换方法的代码:
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;
}
我将非常感谢您的帮助,建议或代码:)
UPD
另外,我忘记从控制器中添加一段代码:
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);
我不能忽略任何字段,因为我需要它们
基本上,您的某些字段被包装到懒惰的休眠代理中。 在序列化对象之前调用Hibernate.initialize(model)
,它将加载您的惰性集合和引用。
但是我不会混合使用数据库和视图模型,这是一个不好的做法。 为您的静态模型创建一组类,并在序列化之前将数据库实体转换为它们。
我用类中的平面字段(String,Boolean,Double等)创建了一个Bean,并设置了转换方法
如果您使用的是延迟加载,请添加此内容
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.