有时您必须使用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