HttpMessageNotWritableException из-за бесконечной рекурсии с Джексоном JSON - PullRequest
0 голосов
/ 09 марта 2020

У меня двунаправленные отношения с двумя объектами, и я получаю исключение HttpMessageNotWritableException из-за JsonMappingException. Я использую аннотацию Джексона @JsonIgnore, чтобы разорвать цикл, но кажется, что этого недостаточно.

Упрощенная версия кода двух моих сущностей выглядит так:

public class MyClassA {
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "objectA")
    private Set<MyClassB> myListOfBObjects = new HashSet<>();

    public void add(MyClassB objectB) {
        this.myListOfBObjects.add(objectB);
        objectB.setObjectA(this);
    }
}

public class MyClassB {
    @ManyToOne(optional = false)
    @JsonIgnore
    MyClassA objectA;
}

Я тестировал это поведение, чтобы убедиться, что цикл был нарушен с этим модульным тестом, который проходит. Удаление аннотации @JsonIgnore делает тест неудачным с ожидаемым исключением.

@Test
public void test() throws IOException {
    MyClassA objectA = new MyClassA();
    MyClassB objectB = new MyClassB();
    objectA.add(objectB);

    String result = new ObjectMapper().writeValueAsString(objectA);

    Assert.assertThat(result, Matchers.not(Matchers.containsString("objectA")));
}

Однако при выполнении запроса к моей конечной точке, который возвращает объект типа MyClassA, я получаю упомянутое исключение:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException

Я пытался также использовать @JsonManagedReference и @JsonBackReference, что также делает мой модульный тест успешным, но все еще вызывает исключение в контроллере.

Что мне здесь не хватает?

...