我有以下方法,幕后使用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不要解析延迟加载的属性,以防止异常
@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时的循环引用答案 0 :(得分:4)
正如NimChimpsky所说,问题是由模型中的循环引用引起的,在类Branch中。除了使用dtos使序列化变得简单之外,对于那些不想使用DTO(像我一样)的人来说,另一个解决方案是使用一些注释来告诉Jackson如何处理属性。这些是需要的注释:
在类Store中,属性分支:
@OneToMany(mappedBy = "store", cascade = CascadeType.ALL)
@JsonManagedReference // this annotation prevents the exception
private List<Branch> branches
在类Branch中,在属性存储中:
@JoinColumn(name = "LUGAR_FK", referencedColumnName = "LUGAR_ID")
@ManyToOne(optional = false)
@JsonBackReference // this annotation prevents the exception
private Lugar lugar;
答案 1 :(得分:3)
分支是否包含非原始的?
序列化似乎是罪魁祸首......特别是循环引用。
我通常创建特定于表单的dto并保持serialziation简单。
答案 2 :(得分:0)
我知道这回答了一段时间,但它帮助我找到了一些解决方法。
为了消除对价值的循环引用,无论如何我都不需要。 我创建了内部类,只有我需要的字段(没有一个是引用一个/多个到一个/多个) 并将内部私有类写入ResponseBody