我正在使用Spring data jpa
和Spring MVC
并且我进行了ajax调用来更新jsp页面,但我在google chorme中出错:
POST http://localhost:8080/pagesjaunes/loadfonction 500 (Erreur Interne de Servlet) jquery-1.10.2.js:8706
send jquery-1.10.2.js:8706
x.extend.ajax jquery-1.10.2.js:8136
(anonymous function) ajoutcontact.js:15
x.event.dispatch jquery-1.10.2.js:5095
v.handle jquery-1.10.2.js:4766
我的ajax调用看起来像那样:
$.ajax({
url : 'loadfonction',
type : 'post',
data : { "idquality" : idquality },
success : function(fonctions) {
[...]
},
error : function(){
alert("error");
}
});
我的控制器
@RequestMapping(value="/loadfonction")
public @ResponseBody
Set<Fonction> loadfonction(Map<String, Object> model, HttpServletRequest request) {
return qualiteRepo.findOne(Integer.valueOf(request.getParameter("idquality"))).getFonctions();
}
Fonction
是我的实体映射:
@Entity
@Table(name = "fonction", catalog = "pagesjaunes")
public class Fonction implements java.io.Serializable {
[...]
}
与Set<Fonction>
有什么关系?因为我测试其他代码并且它的工作是:
@RequestMapping(value="/loadfonction")
public @ResponseBody
Set<Fonction> loadfonction(Map<String, Object> model, HttpServletRequest request) {
Set<String> test = new HashSet<String>(0);
test.add("yous");
test.add("cc");
test.add("fz");
return test;
}
我的实体Fonction
@Entity
@Table(name = "fonction", catalog = "pagesjaunes")
public class Fonction implements java.io.Serializable {
private Integer id;
private Qualite qualite;
private String nom;
private Set<Contact> contacts = new HashSet<Contact>(0);
private Set<Domaine> domaines = new HashSet<Domaine>(0);
public Fonction() {
}
public Fonction(String nom) {
this.nom = nom;
}
public Fonction(String nom, Qualite qualite) {
this.qualite = qualite;
this.nom = nom;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_qualite")
public Qualite getQualite() {
return this.qualite;
}
public void setQualite(Qualite qualite) {
this.qualite = qualite;
}
@Column(name = "nom", nullable = false, length = 20)
public String getNom() {
return this.nom;
}
public void setNom(String nom) {
this.nom = nom;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "fonction")
public Set<Contact> getContacts() {
return this.contacts;
}
public void setContacts(Set<Contact> contacts) {
this.contacts = contacts;
}
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "fonction_domaine", catalog = "pagesjaunes", joinColumns = { @JoinColumn(name = "id_fonction", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "id_domaine", nullable = false, updatable = false) })
public Set<Domaine> getDomaines() {
return this.domaines;
}
public void setDomaines(Set<Domaine> domaines) {
this.domaines = domaines;
}
}
答案 0 :(得分:1)
必须存在延迟加载错误。奇怪的是你没有堆栈跟踪服务器端顺便说一句。如果您正在使用日志工具(如log4j或logback),请检查您的配置以将任何输出附加到控制台。
一个简单的解决方案是在Fonction
实体的延迟加载getter上添加@JsonIgnore注释。
但最好的解决方案是创建一个新的网络端普通POJO,它只存储您在success
AJAX回调中寻找的属性。
例如,如果您只需要id
实体的nom
和Fonction
属性:
public class WebFonction implements Serializable {
private int id;
private String nom;
public WebFonction(Fonction fonction) {
id = fonction.getId();
nom = fonction.getNom();
}
// getters and setters
}
然后,在您的控制器中,您将返回Set<Fonction>
而不是返回Set<WebFonction>
:
@RequestMapping(value = "/loadfonction", method = RequestMethod.POST)
@ResponseBody
public Set<WebFonction> loadfonction(@RequestParameter Integer idquality) {
Set<Fonction> fonctions = qualiteRepo.findOne(idquality).getFonctions();
Set<WebFonction> webFonctions = new HashSet<WebFonction>();
for (Fonction fonction : fonctions) {
webFonctions.add(new WebFonction(fonction));
}
return webFonctions
}