gpt4 book ai didi

Spring MVC : exception when using @ResponseBody and entity with circular reference

转载 作者:行者123 更新时间:2023-12-04 23:55:22 24 4
gpt4 key购买 nike

我有以下方法,它在幕后使用 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从 View 中调用该方法
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 并发送到 View 。另外,我正在为 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时的循环引用

最佳答案

正如 NimChimpsky 所说,问题是由模型中的循环引用引起的,在类 Branch 中。除了使用 dtos 使序列化变得简单之外,对于不想使用 DTOs 的人(如我)的另一个解决方案是使用一些注释来告诉 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;

关于Spring MVC : exception when using @ResponseBody and entity with circular reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17277078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com