ajax调用后返回Collection

时间:2014-01-22 22:45:56

标签: jquery ajax spring-mvc spring-data

我正在使用Spring data jpaSpring 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;
}

}

1 个答案:

答案 0 :(得分:1)

必须存在延迟加载错误。奇怪的是你没有堆栈跟踪服务器端顺便说一句。如果您正在使用日志工具(如log4j或logback),请检查您的配置以将任何输出附加到控制台。

一个简单的解决方案是在Fonction实体的延迟加载getter上添加@JsonIgnore注释。

但最好的解决方案是创建一个新的网络端普通POJO,它只存储您在success AJAX回调中寻找的属性。

例如,如果您只需要id实体的nomFonction属性:

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
}