实体关系打破了GET请求 - Spring MVC

时间:2017-08-24 12:08:14

标签: java spring spring-mvc

我最近添加了@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对象数组。有什么想法可能会发生吗?

谢谢!

2 个答案:

答案 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(数据传输对象)。因此,如果您将它们命名为BookDTOBookCategoryDTO,则一切都将清晰

答案 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响应。包含注释会阻止此操作并返回相应的响应