【问题标题】:returning Collection after ajax callajax 调用后返回 Collection
【发布时间】:2014-02-13 06:17:23
【问题描述】:

我正在使用 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&lt;Fonction&gt; 的作用是什么?因为我测试了其他代码并且它的工作:

@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;
}

}

【问题讨论】:

  • 能否提供服务器端堆栈跟踪(如果有)?
  • 服务器端什么都没发生!
  • request.getParameter("idquality") 是否返回预期值?如果是,qualiteRepo.findOne(Integer.valueOf(request.getParameter("idquality"))) 也会返回预期的Qualite(我猜)?
  • 是的,数据正在从数据库中检索,我尝试qualiteRepo.findOne(Integer.valueOf(request.getParameter("idquality"))).getFonctions().size(),他返回了正确的大小。
  • 尝试在Fonction类的以下方法上添加org.codehaus.jackson.annotate包中的@JsonIgnore注解,看看是否仍然出现错误:getQualite()getContacts()和@987654341 @.

标签: jquery ajax spring-mvc spring-data


【解决方案1】:

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

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

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

例如,如果您只需要 Fonction 实体的 idnom 属性:

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&lt;WebFonction&gt;,而不是返回 Set&lt;Fonction&gt;

@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
}

【讨论】:

  • 谢谢,但我认为 @JsonIgnore 是最好的解决方案,因为有了新的 pojo,如果我们有很多实体,就会有很多重复的代码。
  • 好的,但请注意,使用 @JsonIgnore 注释的每个字段/getter 都不会被序列化,因此不会在您的 AJAX 成功回调中访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多