пустое поле при записи в виде строки подкласса Throwable с использованием Jackson 2.x

Когда я запускаю следующий код:

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 (в дополнение к предыдущему, с нулевым значением).

Я хочу, чтобы поле «причина» выводило простое имя класса, поэтому я знаю причину исключения.


person unlimitednzt    schedule 21.10.2017    source источник
comment
Я помню серьезные головные боли в предыдущем проекте из-за сериализации Throwable и особенно с полем «причина». Возможно, на этот раз вы найдете хороший способ сделать то, что хотите, но лично, если бы мне пришлось сделать это снова, я бы преобразовал исключения в свои собственные классы моделей перед сериализацией/jsonify   -  person Joel    schedule 21.10.2017
comment
Как бы вы преобразовали исключения? поле «причина» должно иметь возможность ссылаться на исключение, у которого есть другое поле «причина», которое должно ссылаться на исключение, и так далее.   -  person unlimitednzt    schedule 21.10.2017
comment
Я предполагаю, что в какой-то момент у вас могут быть произвольные правила, которые ограничивают то, что вы сохраняете. Это во многом зависит от вашего варианта использования, это будет отличаться, если вам просто нужно передать информацию об исключениях, не используя ее алгоритмически, или если вам действительно нужно, чтобы исключение обрабатывалось после сериализации, и в этом случае это может быть сложнее   -  person Joel    schedule 22.10.2017