[Web] @JsonIgnore 与 @JsonProperty

@JsonIgnore 与 @JsonProperty

问题描述

在前后端分离的Web项目中,前端用的是Ant Designer,后端用Spring MVC。要求后端实体对象序列化为Json数据时忽略掉某属性,而在前端发送Json数据到后端反序列化为实体对象时不忽略掉该属性。

@ManyToOne 和 @OneToMany

对于具有一对多关系的两个实体订单表Order和订单条目表OrderItemOrderItem中会有属性order引用,多个订单条目对应一个订单,通过@ManyToOne映射数据库的外键关系:

@Entity
@Table(name="order_item")
public class OrderItem implements java.io.Serializable{
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
	@JoinColumn(name = "order_id")
	public Order getOrder() {
		return this.order;
	}
}

Order中会有属性items引用多个订单条目,通过@OneToMany映射数据库一对多关系:

@Entity
@Table(name="order")
public class Order implements java.io.Serializable{
	@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="order")
	public Set<OrderItem> getItems() {
		return this.items;
	}
}

这里使用mappedBy而不是@JoinColumn来维护一对多关系,可以参考博客 hibernate基于注解的维护权反转:@OneToMany(mappedBy=)

@JsonIgnre

当前端向后端请求订单或订单条目的详情信息时,后端将实体对象序列化为Json数据传给前端,因为OrderOrderItem之间有循环引用关系,所以序列化时会报错,前端无法获取数据。

解决办法便是打破循环引用,可以使用@JsonIgnore使Order实体序列化为Json数据时,忽略掉items属性,这里从开发习惯上一般忽略一对多的关系,获取订单条目另写接口。而多对一关系则不需要忽略,可以在返回订单条目信息时直接返回对应订单信息。

JsonIgnore属性可以使用在属性或Getter方法上,使Java对象序列化为Json数据时忽略此属性。

采用以上方法,可以解决前端获取后端数据的问题,但对于另一个需求,创建订单接口,前端按照后端订单实体的格式包装Json数据传给后端,反序列化为Java对象,再保存到数据库中。订单条目信息保存在订单Json数据的items属性中,但在使用@JsonIgnore后反序列化时该属性也会被忽略,导致后端无法获取前端Json数据的items属性值。

@JsonProperty

后来经过查询,我们发现可以采用如下方法解决:

  • Getter方法上使用@JsonIgnore属性,使Java对象序列化时忽略掉该属性,不传给前端;
  • Setter方法上使用JsonProperty属性,使Json数据反序列化为Java对象时不忽略该属性,正常获取该属性值。

修改后的代码如下:

@Entity
@Table(name="order")
public class Order implements java.io.Serializable{

	@JsonIgnore
	@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="order")
	public Set<OrderItem> getItems() {
		return this.items;
	}

	@JsonProperty
	public void setItems(Set<OrderItem> items){
		this.items = items;
	}
}

参考资料

[1] @OneToMany、@ManyToOne以及@ManyToMany讲解 https://www.cnblogs.com/yinchuan/p/6052507.html
[2] hibernate基于注解的维护权反转:@OneToMany(mappedBy=) http://www.cnblogs.com/chiangchou/p/mappedBy.html
[3] Annotation Type JsonIgnore https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonIgnore.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值