java-处理Jackson亲子序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-处理Jackson亲子序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7361字,纯文字阅读大概需要11分钟。
内容图文
![java-处理Jackson亲子序列化](/upload/InfoBanner/zyjiaocheng/679/6e78fad3907740fcbefa1f17d94df90a.jpg)
我在项目中使用Spring MVC(这是一个新功能),Hibernate和Jackson,并且在服务器和客户端之间使用JSON进行数据交换.
我有一对具有ManyToOne / OneToMany关系的“雇员”和“地址”类.
我遇到了循环引用错误,但是,我能够使用@JsonManagedReference和@JsonBackReference解决该问题.
但是问题是,在序列化过程中(我正在查询数据库以获取所有雇员),Jackson完全忽略了Address属性,仅序列化了3个字段(其他字段已被特别忽略,您可以在代码中看到).
这是返回的JSON
[
{
"id": 1,
"name": "xxx",
"age": 100
},
{
"id": 2,
"name": "yyy",
"age": 100
}
]
员工类别:
@Entity
@Table(name = "e_employee", catalog = "emploman")
public class Employee implements java.io.Serializable {
private int id;
private String name;
private int age;
private Address address;
private String modifiedBy;
private Date modifiedTime;
private transient int addressId;
public Employee() {
}
public Employee(int id, String name, int age, Address address, String modifiedBy, Date modifiedTime) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
this.modifiedBy = modifiedBy;
this.modifiedTime = modifiedTime;
}
public Employee(String name, int age, Address address, String modifiedBy, Date modifiedTime) {
this.name = name;
this.age = age;
this.address = address;
this.modifiedBy = modifiedBy;
this.modifiedTime = modifiedTime;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "name", nullable = false, length = 100)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "age", nullable = false)
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "address", nullable = false)
@JsonBackReference("employee-address")
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Column(name = "modified_by", nullable = false, length = 50)
@JsonIgnore
public String getModifiedBy() {
return modifiedBy;
}
@JsonIgnore
public void setModifiedBy(String modifiedBy) {
this.modifiedBy = modifiedBy;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modified_time", nullable = false, length = 19)
@JsonIgnore
public Date getModifiedTime() {
return modifiedTime;
}
@JsonIgnore
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
@JsonIgnore
@Transient
public int getAddressId() {
return addressId;
}
@JsonIgnore
public void setAddressId(int addressId) {
this.addressId = addressId;
}
}
地址类别:
@Entity
@Table(name = "e_address", catalog = "emploman")
public class Address implements java.io.Serializable {
private int id;
private String country;
private String state;
private String city;
private String streetAddress;
private String pinCode;
private String modifiedBy;
private Date modifiedTime;
private Set<Employee> employees;
public Address() {
}
public Address(int id, String country, String state, String city, String streetAddress, String pinCode, String modifiedBy, Date modifiedTime, Set<Employee> employees) {
this.id = id;
this.country = country;
this.state = state;
this.city = city;
this.streetAddress = streetAddress;
this.pinCode = pinCode;
this.modifiedBy = modifiedBy;
this.modifiedTime = modifiedTime;
this.employees = employees;
}
public Address(String country, String state, String city, String streetAddress, String pinCode, String modifiedBy, Date modifiedTime, Set<Employee> employees) {
this.country = country;
this.state = state;
this.city = city;
this.streetAddress = streetAddress;
this.pinCode = pinCode;
this.modifiedBy = modifiedBy;
this.modifiedTime = modifiedTime;
this.employees = employees;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "country", nullable = false, length = 100)
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Column(name = "state", nullable = false, length = 100)
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Column(name = "city", nullable = false, length = 100)
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Column(name = "street_address", nullable = false, length = 500)
public String getStreetAddress() {
return streetAddress;
}
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
@Column(name = "pincode", nullable = false, length = 15)
public String getPinCode() {
return pinCode;
}
public void setPinCode(String pinCode) {
this.pinCode = pinCode;
}
@Column(name = "modified_by", nullable = false, length = 50)
public String getModifiedBy() {
return modifiedBy;
}
public void setModifiedBy(String modifiedBy) {
this.modifiedBy = modifiedBy;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modified_time", nullable = false, length = 19)
public Date getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
@OneToMany(mappedBy = "address", fetch = FetchType.LAZY)
@JsonManagedReference(value = "employee-address")
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
因此,基本上,我期望的json响应如下所示:
[
{
"id": 1,
"name": "xxx",
"age": 100,
"address": {
"country": "xxx",
"city": "abc"
}
}
]
谁能帮忙吗?
更新1
我尝试从数据库获取地址,并且成功获取了与该地址相关的员工
[
{
"id": 1,
"country": "xxx",
"state": "yyy",
"city": "zzz",
"streetAddress": "abc",
"pinCode": "12345",
"modifiedBy": "xxx",
"modifiedTime": 1400930509000,
"employees": [
{
"id": 2,
"name": "xxx",
"age": 190
},
{
"id": 1,
"name": "xxx",
"age": 200
}
]
}
]
解决方法:
谢谢大家
通过在类(父级和子级)上使用JsonIdentityInfo以及名为jackson-datatype-hibernate的插件,我启用了名为FORCE_LAZY_LOADING的功能,从而能够解决此问题.
如果对任何人都有用,则下面是上述两种配置的代码:
创建如下所示的类以启用jackson-datatype-hibernate
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
Hibernate4Module hbm = new Hibernate4Module();
hbm.enable(Hibernate4Module.Feature.FORCE_LAZY_LOADING);
registerModule(hbm);
}
}
告诉Spring使用以上ObjectMapper而不是Jackson提供的默认值:
<mvc:annotation-driven>
<mvc:message-converters>
<!-- Use the HibernateAware mapper instead of the default -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.adwitiya.o2plus.utilities.HibernateAwareObjectMapper" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
至于JsonIdentityInfo,下面是代码.注意JsonIgnoreProperties的使用(我主要在所有集合上使用它,因为它创建了一个递归的大树,我想避免这种情况)
@Entity
@Table(name = "o2_branch", catalog = "o2plus"
)
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id")
@JsonIgnoreProperties(value = {"active", "modifiedBy", "modifiedTimestamp", "members", "staff"})
public class Branch implements java.io.Serializable {
private Long id;
private Address address;
private String name;
private String contactNumber;
private Integer capacity;
private String manager;
private boolean active;
private String modifiedBy;
private Date modifiedTimestamp;
private Set<Member> members = new HashSet<Member>(0);
private Set<Staff> staff = new HashSet<Staff>(0);
希望它能帮助更多的人.
内容总结
以上是互联网集市为您收集整理的java-处理Jackson亲子序列化全部内容,希望文章能够帮你解决java-处理Jackson亲子序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。