У меня двунаправленные отношения с двумя объектами, и я получаю исключение 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
, что также делает мой модульный тест успешным, но все еще вызывает исключение в контроллере.
Что мне здесь не хватает?