繁体   English   中英

Spring Boot REST Controller问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM