[英]Spring Boot REST Controller issues
我在使用Rest Controller时遇到一个非常奇怪的问题。 我有一个非常基本的休息控制器。
package com.therealdanvega.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.therealdanvega.domain.Post;
import com.therealdanvega.service.PostService;
@RestController
public class PostController {
private PostService postService;
@Autowired
public PostController(PostService postService){
this.postService = postService;
}
@RequestMapping("posts/test")
public String test(){
return "test...";
}
@RequestMapping( name="/posts/", method=RequestMethod.GET )
public Iterable<Post> list(){
return postService.list();
}
}
那叫服务
package com.therealdanvega.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.therealdanvega.domain.Post;
import com.therealdanvega.repository.PostRepository;
@Service
public class PostService {
private PostRepository postRepository;
@Autowired
public PostService(PostRepository postRepository){
this.postRepository = postRepository;
}
public Iterable<Post> list(){
return postRepository.findAll();
}
}
这将调用存储库以获取数据。
package com.therealdanvega.repository;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.therealdanvega.domain.Post;
@Repository
public interface PostRepository extends CrudRepository<Post, Long> {
Post findFirstByOrderByPostedOnDesc();
List<Post> findAllByOrderByPostedOnDesc();
Post findBySlug(String slug);
}
我在内存数据库中使用H2,并且那里只有一个Post记录,可以通过转到H2控制台并再次运行select表来确认这一点。
如果访问/ test URL,则会得到与打印到浏览器中的字符串“ test ...”完全相同的期望。 如果我尝试列出所有帖子(再次为1),则浏览器将一遍又一遍地循环播放,并继续打印出表示1个帖子的JSON,以至于应用程序崩溃了很多次,我在控制台中看到了
2015-11-07 17:58:42.959错误5546 --- [nio-8080-exec-1] oaccC [。[。[/]。[dispatcherServlet]:Servlet调度程序的Servlet.service()抛出异常java.lang .IllegalStateException:此响应已被调用getOutputStream()
这是我访问/ posts时浏览器的外观,其中应该仅列出1
Post Domain Class
package com.therealdanvega.domain;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.springframework.data.annotation.CreatedDate;
@Entity
public class Post {
@Id @GeneratedValue
private Long id;
private String title;
@Column(columnDefinition = "TEXT")
private String body;
@Column(columnDefinition = "TEXT")
private String teaser;
private String slug;
@CreatedDate
@Temporal(TemporalType.TIMESTAMP)
private Date postedOn;
@ManyToOne
private Author author;
@SuppressWarnings("unused")
private Post(){
}
public Post(String title){
this.setTitle(title);
}
// getters & setters
}
有人知道我在这里做错了什么吗? 为什么不只以JSON格式显示1条记录?
您的Post
对象似乎具有循环引用。 Post
对象中的Author
对象具有Posts对象的列表,依此类推。 尝试将@JsonIgnore
批注放置在post对象的author属性上。
您也可以使用@JsonBackReference
和@JsonManagedReference
解决问题。
从Jackson文档中 :
对象引用,身份
@ JsonManagedReference,@ JsonBackReference:一对注释,用于指示和处理以一对匹配属性表示的父/子关系@JsonIdentityInfo:类/属性注释,用于指示在序列化/反序列化值时要使用对象标识,例如多个对单个Java对象的引用可以适当地反序列化。 这可用于正确处理循环对象图和有向无环图。
我相信您的“帖子”域对象包含“作者”域对象,该字段又在“帖子”字段中包含该作者的所有帖子,而该字段又包含包含帖子的作者...您将看到我要去的地方。
最好使用访存或加载图来优化查询的访存策略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.