Spring MVC:使用@ResponseBody和带有循环引用的实体时发生异常


问题内容

我有以下方法,该方法在幕后使用Jackson来将实体列表解析为json:

@Controller
@RequestMapping("/user/")
public class EditarLugarController {

@RequestMapping(value = "stores/{id}/branches", method = RequestMethod.GET)
public @ResponseBody List<Branch> renderBranchesPerStore(@PathVariable(value = "id") Integer id) {
    if(branches == null) {
        //get branches based on store's id 
    }
   return branches;
}

使用jquery从视图通过ajax调用此方法

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使用Jackson插件,该插件告诉Jackson不要解析延迟加载的属性,以防止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,它也可以解决相同的异常,我必须已经测试了该错误。所以问题实际上是解析json时的循环引用


问题答案:

Branch是否包含非基本语?

这似乎是罪魁祸首…特别是循环引用。

我通常创建特定于表单的dto,并保持序列化的简单性。