2014-10-11 37 views
1

我有兩個類:Spring:爲什麼normal和@ResponseBody控制器生成不同的代碼?

/* ------------------------------------------------------ */ 
@Entity 
@Table(name="ABC") 
@NamedQuery(name="Abc.findAll", query="SELECT c FROM Abc c") 
public class Abc implements Serializable { 

    @Id @Column(unique=true, nullable=false) 
    private int id; 

    @ManyToOne 
    @JoinColumn(name="def_id", nullable=false) 
    private Def def; 

    // getters and setters... 

} 
/* ------------------------------------------------------ */ 
@Entity 
@Table(name = "DEF") 
@NamedQuery(name = "Def.findAll", query = "SELECT c FROM Def c") 
public class Def implements Serializable { 

    @Id @Column(unique = true, nullable = false) 
    private int id; 

    @OneToMany(mappedBy = "def") 
    private List<Abc> abc; 

    public Def() { 
    } 
    // getters and setters... 
} 
/* ------------------------------------------------------ */ 

AbcDef多對一關聯。

我需要從類Abc生成HTML表和JSON。我在控制器下面的代碼:

@RequestMapping(value="/page", method=RequestMethod.GET) // HTML table 
public String getPage(Model model) { 
    List<Abc> abc = AbcManager.findAll(); 
    model.addAttribute("abc", abc); 
    return "abc"; 
} 

@RequestMapping(value="/json", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE) // JSON (REST API) 
public @ResponseBody List<Abc> getJson() { 
    List<Abc> abc = AbcManager.findAll(); 
    return abc; 
} 

如果我去的URL /page,一切正常。但如果我去url /json我得到這個錯誤:

Oct 11, 2014 11:01:19 ODP. org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [spring] in context with path [/project] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: net.example.project.entity.Def.nodes, could not initialize proxy - no Session] with root cause 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: net.example.project.entity.Def.nodes, could not initialize proxy - no Session 

問題在哪裏?我不希望在輸出中包含所有Def的列表。 「正常」控制器對我來說是正確的,但不是其他控制器。爲什麼?

我該如何解決?

回答

2

只是猜測,因爲我不知道到底是什麼/page顯示器,但恕我直言,這是因爲在/page,你只顯示Abc對象,每個列表其Def,並且我認爲的Def裝載渴望(不懶)。所以當你將模型傳遞給視圖時,所有的數據都從數據庫中取出

但是傑克遜更多聰明並試圖儘可能深入地通過所有關係。因此,它收到一個Abc的列表,但每個列表都有一個Def(如上所示),但Def的列表爲Abc,Jackson試圖找到列表以放入Def的輸出中。當事務結束時,Hibernate沒有Session,所以Exception。

您將不得不在Def中添加對Json序列化的註釋以聲明@OneToMany(mappedBy = "def") private List<Abc> abc;不應被序列化。

0

我刪除了傑克遜JSON映射器。

現在我正在使用org.json.simple手動創建JSON,並且一切正常。

相關問題