Когда я запускаю следующий код:
public static void main(String[] args) throws JsonProcessingException {
Throwable ex = new IllegalArgumentException("something is wrong");
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.writeValueAsString(ex));
}
Вывод на консоль покажет, что значение в поле «причина» в классе Throwable равно null. Это происходит из-за циклической ссылки — поле класса инициализируется значением «это».
Я понял, что @JsonIdentityInfo — это то, что я ищу, но Throwable — это не тот класс, который я создал, поэтому я нужно использовать Mixin. документация устарела. После прочтения этого обсуждения на GitHub, это моя последняя попытка добавить миксин :
public static void main(String[] args) throws JsonProcessingException {
Throwable ex = new IllegalArgumentException("something" +
" wrong");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Throwable.class, MyMixn.class);
System.out.println(objectMapper.writeValueAsString(ex));
}
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator
.class, property = "cause")
public static abstract class MyMixn {
}
Однако это только добавляет к выходным данным еще одно поле «причина» со значением 1 (в дополнение к предыдущему, с нулевым значением).
Я хочу, чтобы поле «причина» выводило простое имя класса, поэтому я знаю причину исключения.