2013-06-24 22 views
4

例外,我有以下方法,它幕後使用傑克遜的實體名單解析爲JSON:Spring MVC的:使用時@ResponseBody和實體循環引用

這種方法是從視圖中調用通過Ajax使用jquery

var idBranch = '${store.id}'; 
$.get("http://localhost:8080/myapp/user/stores/" + idBranch+ "/branches", 
    function(data) { 
     // show json objects in page 
}); 

的問題是,當該方法結束時,它引發以下例外:

java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:639) 

我試圖刪除@PathVariable(返回一些默認值),它工作正常,但我需要該參數。這個問題有沒有解決方法?

編輯:這裏的分支代碼的要求,但同樣:我不認爲,因爲如果@PathVariable它工作的很好,我不使用它的相關問題,分行的名單解析確定以JSON和發送到視圖。另外,我使用了對Hibernate傑克遜插件,告訴傑克遜不要解析懶加載的屬性,以防止exceptiosn

@Entity 
@Table(name = "BRANCH") 
public class Branch implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@Column(name="BRANCH_ID") 
@GeneratedValue(strategy= GenerationType.TABLE) 
private Integer id; 

@Column(name = "DESCRIPTION") 
@Size(max = 500) 
private String description; 

@Column(name="STREET") 
@NotNull 
@Size(max = 100) 
private String street; 

@Column(name="NUMBER") 
@NotNull 
@Size(max = 6) 
private String number 

@Column(name="FLOOR") 
@Size(max = 3) 
private String floor; 

@Column(name="APT") 
@Size(max = 10) 
private String apt 

@OneToMany(cascade = CascadeType.ALL, mappedBy="branch") 
private List<BranchPhoto> photos; 

@JoinColumn(name = "STORE_FK", referencedColumnName = "STORE_ID") 
@ManyToOne(optional = false) 
private Store store; 

public Branch() {} 

// getters & setters 

}

編輯:我意識到,即使沒有PathVariable它thorws同樣的例外,我必須測試那個錯誤。所以這個問題其實是解析json時的循環引用問題

+1

可以顯示代碼的其餘部分,響應正文和pathvariable work fine together – NimChimpsky

+2

您是否明知地在** your ** code的某個地方寫了迴應?這可能是罪魁禍首,因爲春季也將試圖寫出迴應。 –

+0

Hi @NimChimpsky我添加了一些代碼,我認爲所有相關的代碼都在那裏。唯一缺少的就是調用dao從db中檢索實體。 – Damian

回答

3

Branch是否包含非子女?

該序列化看起來是罪魁禍首......特別是循環引用。

我通常創建表單特定的dto,並保持serialziation簡單。

+0

它確實包含非原語,但我不認爲這是問題的兩個原因:1)如果我不使用PathVariable( ID參數),並返回任何隨機設置的分支它工作正常。 2)我還使用ResponseBody來解析使用Jackson的非基元的其他實體,它也可以正常工作。 – Damian

+0

@Damian分支在json中肯定沒有循環引用? ResponseBody和pathvariable正常工作在一起,它們是無關的......那麼用於ID的是什麼,因爲它傳入方法,顯示方法。 – NimChimpsky

+0

你是對的@NimChimpsky,問題是由於循環引用。我在實體中使用以下注釋對其進行了修復:JsonManagedReference和JsonBackReference。你能否更新你的答案,包括這個或其他解決循環參考的方法? – Damian

4

正如NimChimpsky所說,問題是由模型中的循環引用引起的。除了使用dtos來簡化序列化之外,對於那些不想使用DTO的人來說(比如我),另一種解決方案是使用一些註釋來告訴Jackson如何處理這些屬性。這些都是必要的註釋:

在類商店,屬性分支:

@OneToMany(mappedBy = "store", cascade = CascadeType.ALL) 
@JsonManagedReference // this annotation prevents the exception 
private List<Branch> branches 

,並在類分支,在屬性存儲設備:

+1

對我來說,當我使用'@ OneToMany'和'@ ManyToMany'註釋將實體返回爲控制器中的JSON時,發生錯誤 - 導致IllegalStateException的JSON對象的循環包含。這個註解解決了這個問題。謝謝! – Croo

+0

我面臨同樣的循環遏制問題!非常感謝 :) – Anusha

0

我知道這是在不久前回答,但它幫助我找到了一些解決方法。

爲了消除我不需要的循環引用值。 我創建了只有我需要的字段的內部類(這些都沒有引用一/多對一/許多) 並將內部私有類寫入ResponseBody

相關問題