如何修复 spring 引导一对多双向无限循环?
how to Fix spring boot one to many bidirectional infinity loop?
我正在尝试使用 spring 引导和 spring 数据 jpa 创建一对多双向映射请查看下面的实体
Employer Entity
@Entity
public class Employer
{
private Long id;
private String employerName;
private List<Employee> employees;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getEmployerName()
{
return employerName;
}
public void setEmployerName(String employerName)
{
this.employerName = employerName;
}
@OneToMany(cascade=CascadeType.ALL, mappedBy="employer")
public List<Employee> getEmployees()
{
return employees;
}
public void setEmployees(List<Employee> employees)
{
this.employees = employees;
}
}
Employee Entity
@Entity
public class Employee
{
private Long id;
private String employeeName;
private Employer employer;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getEmployeeName()
{
return employeeName;
}
public void setEmployeeName(String employeeName)
{
this.employeeName = employeeName;
}
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
public Employer getEmployer()
{
return employer;
}
public void setEmployer(Employer employer)
{
this.employer = employer;
}
}
Employer Repo
public interface EmployerServices extends JpaRepository<Employer, Long> {
}
Employee Repo
public interface EmployeeServices extends JpaRepository<Employee, Long> {
}
REST Controller is
@RestController
public class Controller {
@Autowired EmployeeServices employeeServices;
@Autowired EmployerServices employerServices;
@GetMapping("/getempr")
public Object getempr(){
return employerServices.findOne(1L);
}
}
现在问题开始了,开始看我的输出
它看起来像一个内斗循环,并且我的服务器抛出错误 getOutputStream() 已经被调用用于此响应。
I used @JsonBackReference & @JsonManagedReference
注释,但问题是它像一对多一样工作
{
"id":1,
"employerName":"employer",
"employees":[
{"id":1,"employeeName":"emp1"},
{"id":2,"employeeName":"emp2"}
]
}
如果我想像所有雇员和雇主一样引起多对一的关注。输出是
[
{
"id":1,
"employeeName":"emp1"
},
{
"id":2,
"employeeName":"emp2"}
]
它没有向我显示雇主详细信息。
请大家告诉我我做错了什么。提前致谢!!
而不是使用 @JsonBackReference
和 @JsonManagedReference
尝试使用注释 @JsonIgnoreProperties
:
@JsonIgnoreProperties("employer")
private List<Employee> employees;
@JsonIgnoreProperties("employees")
private Employer employer;
它阻止 Jackson 呈现关联对象的指定属性。
您可以通过注释修改两次来解决您的问题。
Employer.class
@Entity
public class Employer {
private Long id;
private String employerName;
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "employer",
orphanRemoval = true)
private List<Employee> employees;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmployerName() {
return employerName;
}
public void setEmployerName(String employerName) {
this.employerName = employerName;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employee.class
@Entity
public class Employee {
private Long id;
private String employeeName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employer_id")
private Employer employer;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public Employer getEmployer() {
return employer;
}
public void setEmployer(Employer employer) {
this.employer = employer;
}
}
有关详细信息,请访问此 link。
JSON 是双向映射的问题。使用以下属性。
@JsonIgnoreProperties("employer")
@JsonIgnoreProperties("employees")
请保持抓取类型为 eager。
希望这会奏效。
像这样更改您的 getEmployer 方法:
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
public Employer getEmployer()
{
return employer;
}
使用
@JsonProperty(access = Access.WRITE_ONLY)
private List<Employee> employees;
这样它会在响应中打印到 JSON 时忽略员工(从而防止循环),但仍会考虑您在请求中传递的 JSON 数据(员工列表)正文,以便它可用于持久化。
我正在尝试使用 spring 引导和 spring 数据 jpa 创建一对多双向映射请查看下面的实体
Employer Entity
@Entity
public class Employer
{
private Long id;
private String employerName;
private List<Employee> employees;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getEmployerName()
{
return employerName;
}
public void setEmployerName(String employerName)
{
this.employerName = employerName;
}
@OneToMany(cascade=CascadeType.ALL, mappedBy="employer")
public List<Employee> getEmployees()
{
return employees;
}
public void setEmployees(List<Employee> employees)
{
this.employees = employees;
}
}
Employee Entity
@Entity
public class Employee
{
private Long id;
private String employeeName;
private Employer employer;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getEmployeeName()
{
return employeeName;
}
public void setEmployeeName(String employeeName)
{
this.employeeName = employeeName;
}
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
public Employer getEmployer()
{
return employer;
}
public void setEmployer(Employer employer)
{
this.employer = employer;
}
}
Employer Repo
public interface EmployerServices extends JpaRepository<Employer, Long> {
}
Employee Repo
public interface EmployeeServices extends JpaRepository<Employee, Long> {
}
REST Controller is
@RestController
public class Controller {
@Autowired EmployeeServices employeeServices;
@Autowired EmployerServices employerServices;
@GetMapping("/getempr")
public Object getempr(){
return employerServices.findOne(1L);
}
}
现在问题开始了,开始看我的输出
它看起来像一个内斗循环,并且我的服务器抛出错误 getOutputStream() 已经被调用用于此响应。
I used @JsonBackReference & @JsonManagedReference
注释,但问题是它像一对多一样工作
{
"id":1,
"employerName":"employer",
"employees":[
{"id":1,"employeeName":"emp1"},
{"id":2,"employeeName":"emp2"}
]
}
如果我想像所有雇员和雇主一样引起多对一的关注。输出是
[
{
"id":1,
"employeeName":"emp1"
},
{
"id":2,
"employeeName":"emp2"}
]
它没有向我显示雇主详细信息。
请大家告诉我我做错了什么。提前致谢!!
而不是使用 @JsonBackReference
和 @JsonManagedReference
尝试使用注释 @JsonIgnoreProperties
:
@JsonIgnoreProperties("employer")
private List<Employee> employees;
@JsonIgnoreProperties("employees")
private Employer employer;
它阻止 Jackson 呈现关联对象的指定属性。
您可以通过注释修改两次来解决您的问题。
Employer.class
@Entity
public class Employer {
private Long id;
private String employerName;
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "employer",
orphanRemoval = true)
private List<Employee> employees;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmployerName() {
return employerName;
}
public void setEmployerName(String employerName) {
this.employerName = employerName;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employee.class
@Entity
public class Employee {
private Long id;
private String employeeName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employer_id")
private Employer employer;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public Employer getEmployer() {
return employer;
}
public void setEmployer(Employer employer) {
this.employer = employer;
}
}
有关详细信息,请访问此 link。
JSON 是双向映射的问题。使用以下属性。
@JsonIgnoreProperties("employer")
@JsonIgnoreProperties("employees")
请保持抓取类型为 eager。
希望这会奏效。
像这样更改您的 getEmployer 方法:
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
public Employer getEmployer()
{
return employer;
}
使用
@JsonProperty(access = Access.WRITE_ONLY)
private List<Employee> employees;
这样它会在响应中打印到 JSON 时忽略员工(从而防止循环),但仍会考虑您在请求中传递的 JSON 数据(员工列表)正文,以便它可用于持久化。