我正在使用 Spring MVC 和 JSON 来完成一些任务,但我遇到了这个异常
I'm using Spring MVC and JSON to do some tasks, and i've got this exception
我已经找了三天了,我的错误仍然存在,我尝试了很多解决方案都没有任何积极的结果!
我有 ManyToMany 关系,这是我的 JPA 映射:
@实体
public class Facteur 实现 Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long idF;
.......
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="Affectation",joinColumns=@JoinColumn(name="IdF"), inverseJoinColumns=@JoinColumn(name="idT"))
private List<Tournee> tournees;
.......
}
"Tournee" Class是这样的
@实体
public class Tournee 实现可序列化 {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int idT;
....
@ManyToMany(mappedBy="tournees")
@LazyCollection(LazyCollectionOption.FALSE)
private List<Facteur> facteurs;
.....
}
这是我的控制器:
@RequestMapping(value="/getFacteur/", method=RequestMethod.GET)
@ResponseBody
public Facteur getFacteurById(@RequestParam("id") Long idF) {
Facteur f = facteurService.getById(idF);
System.out.println(f.toString());
return f;
}
和JQuery代码是:
$(document).ready(function() {
$(".updatelink").click(function() {
var facteurId = $(this).data("facteur-id");
$.ajax({
type : "GET",
url : "http://localhost:8080/distribution/facteur/getFacteur/",
data : { id : facteurId },
success : function(data) {
alert('SUCCESSS');
},
error : function(){
alert("ERROR");
}
});
});
});
有什么解决办法吗?
此致!
您 运行 进入 Whosebug 错误,因为 Facteur class 引用了 tournees,而 Tournees 又引用了 Facteur - 在 JSON 序列化时循环引用。
只需将 @JsonIgnore
注释添加到 Facteur
class 中的 private List<Tournee> tournees;
声明,你应该没问题。
不应序列化关系的两侧之一,以避免导致您的 Whosebug 错误的无限循环。您可以使用 @JsonManagedReference
和 @JsonBackReference
来避免错误:
//class Facteur
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="Affectation",joinColumns=@JoinColumn(name="IdF"), inverseJoinColumns=@JoinColumn(name="idT"))
@JsonManagedReference
private List<Tournee> tournees;
//class Tournee
@ManyToMany(mappedBy="tournees")
@LazyCollection(LazyCollectionOption.FALSE)
@JsonBackReference
private List<Facteur> facteurs;
在要序列化的关系的前部添加@JsonManagedReference
,在不序列化的关系的后部添加@JsonBackReference
。事实上,如果你将一个 Tournee 实例序列化为 JSON,你将 而不是 得到 Facteur 数组实例。为避免此缺点,只需使用简单的 @JsonIgnore
,但请记住,因此在序列化期间将忽略 getter 和 setter。
我已经找了三天了,我的错误仍然存在,我尝试了很多解决方案都没有任何积极的结果!
我有 ManyToMany 关系,这是我的 JPA 映射:
@实体 public class Facteur 实现 Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long idF;
.......
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="Affectation",joinColumns=@JoinColumn(name="IdF"), inverseJoinColumns=@JoinColumn(name="idT"))
private List<Tournee> tournees;
.......
}
"Tournee" Class是这样的
@实体 public class Tournee 实现可序列化 {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int idT;
....
@ManyToMany(mappedBy="tournees")
@LazyCollection(LazyCollectionOption.FALSE)
private List<Facteur> facteurs;
.....
}
这是我的控制器:
@RequestMapping(value="/getFacteur/", method=RequestMethod.GET)
@ResponseBody
public Facteur getFacteurById(@RequestParam("id") Long idF) {
Facteur f = facteurService.getById(idF);
System.out.println(f.toString());
return f;
}
和JQuery代码是:
$(document).ready(function() {
$(".updatelink").click(function() {
var facteurId = $(this).data("facteur-id");
$.ajax({
type : "GET",
url : "http://localhost:8080/distribution/facteur/getFacteur/",
data : { id : facteurId },
success : function(data) {
alert('SUCCESSS');
},
error : function(){
alert("ERROR");
}
});
});
});
有什么解决办法吗?
此致!
您 运行 进入 Whosebug 错误,因为 Facteur class 引用了 tournees,而 Tournees 又引用了 Facteur - 在 JSON 序列化时循环引用。
只需将 @JsonIgnore
注释添加到 Facteur
class 中的 private List<Tournee> tournees;
声明,你应该没问题。
不应序列化关系的两侧之一,以避免导致您的 Whosebug 错误的无限循环。您可以使用 @JsonManagedReference
和 @JsonBackReference
来避免错误:
//class Facteur
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="Affectation",joinColumns=@JoinColumn(name="IdF"), inverseJoinColumns=@JoinColumn(name="idT"))
@JsonManagedReference
private List<Tournee> tournees;
//class Tournee
@ManyToMany(mappedBy="tournees")
@LazyCollection(LazyCollectionOption.FALSE)
@JsonBackReference
private List<Facteur> facteurs;
在要序列化的关系的前部添加@JsonManagedReference
,在不序列化的关系的后部添加@JsonBackReference
。事实上,如果你将一个 Tournee 实例序列化为 JSON,你将 而不是 得到 Facteur 数组实例。为避免此缺点,只需使用简单的 @JsonIgnore
,但请记住,因此在序列化期间将忽略 getter 和 setter。