有時您必須使用JavaScript從服務器中獲取一些數據, JSON是完成此任務的不錯選擇。
讓我們玩一下JPA揭秘(第1集)-@OneToMany和@ManyToOne映射中的“雇主-雇員-福利”示例。 我們將在基于Spring Framework的Web應用程序中使用它。
我們的第一個控制器將返回員工列表作為響應正文,在本例中,將自動使用MappingJacksonHttpMessageConverter將handleGet方法返回的值轉換為發送給客戶端的響應。
@Controller
@RequestMapping('/employee-list.json')
public class EmployeeListController {@Autowiredprivate EmployerDAO employerDAO;@RequestMapping(method = RequestMethod.GET)@ResponseBodypublic List<Employee> handleGet(@RequestParam('employerId') Long employerId) {return employerDAO.getEmployees(employerId);}
}
當我們第一次嘗試獲取數據時,我們遇到了一個美麗的異常: JsonMappingException:無限遞歸(StackOverflowError) –由雇主–雇員–福利之間的雙向引用引起。
尋找可能的解決方案,我發現了一條注釋, 該聲明使用聲明式方法處理雙向引用 ,并且在閱讀它之后,已通過以下方式更正了域實體:
@Entity
@Table(name = 'EMPLOYERS')
public class Employer implements Serializable {
...@JsonManagedReference('employer-employee')@OneToMany(mappedBy = 'employer', cascade = CascadeType.PERSIST)public ListgetEmployees() {return employees;}
...
}@Entity
@Table(name = 'EMPLOYEES')
public class Employee implements Serializable {
...@JsonManagedReference('employee-benefit')@OneToMany(mappedBy = 'employee', cascade = CascadeType.PERSIST)public ListgetBenefits() {return benefits;}@JsonBackReference('employer-employee')@ManyToOne(optional = false)@JoinColumn(name = 'EMPLOYER_ID')public Employer getEmployer() {return employer;}
...
}@Entity
@Table(name = 'BENEFITS')
public class Benefit implements Serializable {
...@JsonBackReference('employee-benefit')@ManyToOne(optional = false)@JoinColumn(name = 'EMPLOYEE_ID')public Employee getEmployee() {return employee;}
...
}
完成上述更改后,我終于可以享受我的代碼返回的JSON響應:
[{'id':1, 'benefits':[{'name':'Healthy Employees', 'id':1, 'type':'HEALTH_COVERAGE', 'startDate':1104534000000, 'endDate':null}, {'name':'Gold Autumn','id':2,'type':'RETIREMENT_PLAN','startDate':1104534000000,'endDate':null},{'name':'Always Secured','id':3,'type':'GROUP_TERM_LIFE','startDate':1104534000000,'endDate':null}],'firstName':'John'},{'id':2,'benefits':[],'firstName':'Mary'},{'id':3,'benefits':[],'firstName':'Eugene'}]
和往常一樣,一些甜點的鏈接:
- JSON – JavaScript對象表示法
- Jackson-高性能JSON處理器
參考: JSON – Jackson是我們JCG合作伙伴 Micha的救助者嗎? 術士思想博客上的Ja?tak。
翻譯自: https://www.javacodegeeks.com/2012/09/json-jackson-to-rescue.html