Как предотвратить рекурсивные результаты в RestController? - PullRequest
0 голосов
/ 15 февраля 2020

Классы:

@Entity
@Table(name = "question")
@Data
@NoArgsConstructor
public class Question {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column
private String text;

@OneToMany(mappedBy="question", fetch = FetchType.LAZY)
private List<Answer> answers;

public void addAnswer(Answer answer){
    answer.setQuestion(this);
    this.answers.add(answer);
}
}

@Entity
@Table(name = "answer")
@Data
@NoArgsConstructor
public class Answer {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column
private String text;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="question_id")
private Question question;
}

Контроллер:

@RestController
@CrossOrigin("*")
@RequestMapping("/question")
public class QuestionController {

@Autowired
private QuestionRepository questionRepository;

@GetMapping
public List<Question> list(){
    return questionRepository.findAll();
}

@PostMapping(value = "")
public Question add(@RequestBody Question question){
    return questionRepository.save(question);
}
}

вызов 'localhost: 8080 / answer' возвращает это:

{
"text": "something else again",
"question": {
    "id": 4,
    "text": "question 3",
    "answers": [
        {
            "id": 1,
            "text": "something",
            "question": {
                "id": 4,
                "text": "question 3",
                "answers": [
                    {
                        "id": 1,
                        "text": "something",
                        "question": {
                            "id": 4,
                            "text": "question 3",
                            "answers": [
                                {
                                    "id": 1,
                                    "text": "something",
                                    "question": {
                                        "id": 4,
                                        "text": "question 3",
                                        "answers": [
                                            {
                                                "id": 1,
                                                "text": "something",
                                                "question": {
                                                    "id": 4,
                                                    "text": "question 3",
                                                    "answers": [
                                                        {
                                                            "id": 1,
                                                            "text": "something",
                                                            "question": {
                                                                "id": 4,
                                                                "text": "question 3",
                                                                "answers": [
                                                                    {
                                                                        "id": 1,
                                                                        "text": "something",
                                                                        "question": {
                                                                            "id": 4,
                                                                            "text": "question 3",
                                                                            "answers": [
                                                                                {
                                                                                    "id": 1,
                                                                                    "text": "something",
                                                                                    "question": {
                                                                                        "id": 4,
                                                                                        "text": "question 3",
                                                                                        "answers": [
                                                                                            {
                                                                                                "id": 1,
                                                                                                "text": "something",
                                                                                                "question": {
                                                                                                    "id": 4,
                                                                                                    "text": "question 3",
                                                                                                    "answers": [

Разве это не просто вернуть что-то вроде этого:

{
"text": "something else again",
"question": {
    "id": 4,
    "text": "question 3",
    "answers": [
        {
            "id": 1,
            "text": "something"
         }
    ]
}

1 Ответ

1 голос
/ 15 февраля 2020

Это зависит от того, какую библиотеку JSON вы используете для сериализации объекта до JSON. Если вы используете Джексона, вы можете использовать @JsonIgnoreProperties для прерывания циклов:

@Entity
@Table(name = "question")
public class Question {

         [....]


         @JsonIgnoreProperties("question")
         public List<Answer> getAnswers(){
             return answers;
         }
}

Та же проблема может возникнуть, если вы получите ответ, поэтому вам также может потребоваться прервать цикл оттуда:

@Entity
@Table(name = "answer")
public class Answer {

         [....]


         @JsonIgnoreProperties("answers")
         public Question getQuestion(){
             return question;
         }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...