@JsonIgnoreProperties解决jackson 序列化Hibernate entity类无限递归的问题
2018-02-10 21:34
477 查看
Hibernate 这种ORM框架 通过实体类间相互关联来表示数据库表数据的外键。在使用Jackson序列化时就会出现无限循环或递归的问题导致序列化报错。现在百度一搜就会出现很多几乎一样的解决方法,使用@JsonIgnore,@JsonIdentityInfo,@JsonManagedReference and @JsonBackReference这几个注解,这里就不在写同样的东西了。我们要说一下@JsonIgnoreProperties这个注解, 当然网络上也有这个的一些文章,基本都是说这个可以用在类上指定某些要忽略的属性。
先上实体类:@Entity
@Table
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = -943171790037999181L;
private long id;
private String username;
private Set<Item> items = new HashSet<Item>();
//忽略其他method
@OneToMany(mappedBy = "seller")
@JsonIgnoreProperties(value = {"seller"}, ignoreUnknown = true)
public Set<Item> getItems() {
return items;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
在类上声明的@JsonIgnoreProperties是忽略Hibernate的延迟加载的一些属性"hibernateLazyInitializer", "handler", "fieldHandler",这些属性在实体类里没有所以要忽略掉,否则会报错, 在getter方法上的@JsonIgnoreProperties是声明在序列化时忽略这个属性类的某个属性(例如 User类里的getItems()方法声明忽略掉 Item类里的seller属性,因为seller是引用User类,形成了循环
)。这样无论从那个上返回Json都不会有闭环,解开了循环引用的问题。
先上实体类:@Entity
@Table
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = -943171790037999181L;
private long id;
private String username;
private Set<Item> items = new HashSet<Item>();
//忽略其他method
@OneToMany(mappedBy = "seller")
@JsonIgnoreProperties(value = {"seller"}, ignoreUnknown = true)
public Set<Item> getItems() {
return items;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
@Entity @Table(name = "ITEM_NPLUS_SELECT") @JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) public class Item implements Serializable { /** * */ private static final long serialVersionUID = -5912463915025857241L; private long id; private String name; private LocalDateTime auctionEnd; private User seller; private Set<Bid> bids = new HashSet<Bid>(); //忽略其他method @NotNull @ManyToOne(fetch = FetchType.LAZY) @JsonIgnoreProperties(ignoreUnknown = true, value = {"items"}) public User getSeller() { return seller; } public void setSeller(User seller) { this.seller = seller; } @OneToMany(mappedBy = "item") @org.hibernate.annotations.BatchSize(size = 5) @JsonIgnoreProperties(ignoreUnknown = true, value = {"item"}) public Set<Bid> getBids() { return bids; } public void setBids(Set<Bid> bids) { this.bids = bids; } }
@Entity @Table @JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) public class Bid implements Serializable { /** * */ private static final long serialVersionUID = 7126592140361715240L; private long id; private BigDecimal amount; private Item item; //忽略其他method @NotNull @ManyToOne(fetch = FetchType.LAZY) @JsonIgnoreProperties(ignoreUnknown = true, value = {"bids"}) public Item getItem() { return item; } public void setItem(Item item) { this.item = item; } }
在类上声明的@JsonIgnoreProperties是忽略Hibernate的延迟加载的一些属性"hibernateLazyInitializer", "handler", "fieldHandler",这些属性在实体类里没有所以要忽略掉,否则会报错, 在getter方法上的@JsonIgnoreProperties是声明在序列化时忽略这个属性类的某个属性(例如 User类里的getItems()方法声明忽略掉 Item类里的seller属性,因为seller是引用User类,形成了循环
)。这样无论从那个上返回Json都不会有闭环,解开了循环引用的问题。
相关文章推荐
- 解决jackson 序列化这个对象出现无限递归的问题
- 问题:在程序中保存数据到索引库,发生异常jackson数据转换异常,造成死循环栈溢出 解决@JsonIgnore注解
- @JsonIgnoreProperties注解不起作用的问题解决
- jackson java转json hibernate懒加载造成的无限递归问题
- 省市区级联选择时,jackson 序列化这个对象出现无限递归的问题
- jackson java转json hibernate 造成的堆栈溢出 无限递归问题
- 解决spring mvc +hibernate整合时使用jackson返回json数据无限循环问题的官方解决方案
- Jackson序列化对象时无限递归错误Infinite recursion的解决办法
- Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
- EF webapi json序列化 表间相互引用 无限循环问题解决方案
- asp mvc 中重写JsonResult,解决Json返回值序列化问题
- 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json
- jackson出现错误 Unrecognized field,JsonIgnoreProperties忽略不起作用
- MVC5序列化Json时遇到的大小写问题及解决方法
- Newtonsoft.Json 序列化日期问题解决
- 解决JsonExSerializer无法反序列化JSON时间问题
- 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题(Newtonsoft.Json)
- 解决因为hibernate的懒加载引起的json 序列化失败的问题
- Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
- 解决json-lib的一些序列化循环处理问题