2015-11-07 8 views
0

У меня очень странная проблема с контроллером отдыха. У меня есть очень простой контроллер отдыха.Проблемы с контроллером REST Spring Boot

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 в базе данных памяти и у меня есть только один Начать запись там и могу подтвердить, перейдя в консоль Н2 и работает отборные снова сообщение таблицы.

Если я нахожусь в/тестовом URL-адресе, я получаю именно то, что ожидаю, это строка «test ...», напечатанная в браузере. Если я попробую и перечислить все сообщения (которые снова будут только 1), браузер начинает цикл снова и снова и продолжает печатать JSON, представляющий 1 сообщение, столько раз, что приложение выходит из строя, и я вижу это на консоли

2015-11-07 17: 58: 42,959 ОШИБКА 5546 --- [NiO-8080-Exec-1] oaccC [[[/] [DispatcherServlet]:... Servlet.service() для сервлет DispatcherServlet бросил за исключением java.lang.IllegalStateException: getOutputStream() уже название для этого ответа

Это то, что мой браузер выглядит, когда я посещаю/сообщения, которые должны только список 1

enter image description here

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 
} 

Кто-нибудь знает, что я делаю не так или не хватает? Почему он не показывает только 1 запись в формате JSON?

+0

Почему вы не используете ResponseEntity, в который вы помещаете список своих объектов? Я бы пропустил часть Iterable ... – Marged

+0

Можете ли вы показать объект Post? –

+0

@Marged Я имею в виду, что я мог, но не это то, что должен сделать RestController? Возьмите данные, которые у меня есть, и конвертируйте их и верните JSON? – cfaddict

ответ

3

Кажется, что ваш объект Post имеет круглую ссылку. Объект Author в вашем объекте Post имеет список объектов Posts и т. Д. Попробуйте помещать аннотацию @JsonIgnore на атрибут автора вашего объекта post.

Чтобы решить проблему, вы также можете использовать и @JsonManagedReference.

Из Jackson documentation: Ссылки на объект

идентичность

@JsonManagedReference, @JsonBackReference: пара аннотации используется для указывать и обрабатывать отношения родитель/потомок, выраженных с парой соответствующих свойств @JsonIdentityInfo: аннотация класса/свойства используется , чтобы указать, что Идентификатор объекта должен использоваться, когда значения сериализации/десериализации, так что несколько ссылок с помощью одного объекта Java может быть правильно десериализован. Это может быть использовано для правильно обрабатывать графики циклических объектов и направленные ациклические графики.

+0

Большое вам спасибо! – cfaddict

1

Я считаю, что ваш объект домена Posts содержит объект домена авторского права, который в свою очередь в поле сообщений содержит все записи этого автора, который, в свою очередь, содержит автора, который содержит сообщения ... вы видите, куда я иду с этим.

Возможно, лучше всего использовать fetch or load graphs для оптимизации стратегии выбора запроса.

Смежные вопросы