我最近添加了@ManyToOne
&我的Spring MVC项目中@OneToMany
中的两个@Entity
关联。
@Entity
public class Book {
@ManyToOne
@JoinColumn(name = "book_id")
private BookCategory category;
}
@Entity
public class BookCategory{
@OneToMany(mappedBy = "category")
private List<Book> books;
}
@RequestMapping(value = "getAllBooks", produces = "application/json")
public @ResponseBody List<Book> getAllBooks(){
return bookRepo.findAll(); // Native Spring JPA method
}
在加入联接之前,我可以轻松填充List
个书籍(没有他们的BookCategories)并将其作为JSON响应发送到客户端。
但是,在包含联接后,我的异步请求失败,我在Chrome中收到以下错误
SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>)
在IE上:
Unterminated string constant: {description: "...
同样在Chrome中我看到了
Resource interpreted as Document but transferred with MIME type application/json:
请求本身运行正常,返回200,响应看起来像正常的JSON对象数组。有什么想法可能会发生吗?
谢谢!
答案 0 :(得分:1)
可能的问题可能是无休止的json。 每本书都包含一个类别,ecach类别包含相同的书籍,其中包含类别,其中包含相同的书籍和soo
book: {
category: {
book: {
category: {
book: {
.. and so on
因此mapper可以将您的对象转换为类似json的字符串
修改强> 你可以使用Views修复它。
创建BookView
类和BookCategoryView
类
public class BookCategoryView {
// contains all nessesery fields: id, name ..
// contains getters and setters
// DOESN'T contain book field
}
public class BookView {
// contains all nessesery fields: id, name ..
// contains getters and setters
// here add List<BookCategoryView>
}
如果您将实体对象转换为此视图对象,则没有无限循环依赖关系,而不能忽略该错误
更多信息:通常此类对象调用DTO(数据传输对象)。因此,如果您将它们命名为BookDTO
和BookCategoryDTO
,则一切都将清晰
答案 1 :(得分:0)
我通过将@JsonIgnore
添加到我的BookCategory
实体来解决此问题。
@JsonIgnore
@OneToMany(mappedBy = "category")
private List<Book> books;
说明
@JsonIgnore - Marker annotation that indicates that the annotated method or field
is to be ignored by introspection-based serialization and deserialization functionality.
正如Oleh所指出的,这种反应看起来像无休止的递归JSON响应。包含注释会阻止此操作并返回相应的响应