Java Джексон Десериализация вложенных объектов - PullRequest
0 голосов
/ 14 мая 2018

Работая с AWS Lambdas, и когда происходит сбой из-за исключения, AWS сериализует это исключение как JSON и отправляет его обратно тому, кто вызвал эту Lambda. Вот как это может выглядеть:

{  
     "errorMessage":"USER_SERVICE_FAILURE",
     "errorType":"com.company.project.lambda.core.exceptions.LambdaFailureException",
     "stackTrace":[  
        "com.company.project.lambda.worker.MainWorkerLambda.handleRequest(AccountWorker.java:127)",
        "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
        "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
        "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
        "java.lang.reflect.Method.invoke(Method.java:498)"
     ],
     "cause":{
        "errorMessage":"some other exception error message",
        "errorType":"com.company.project.lambda.core.exceptions.SomeOtherException",
        "stackTrace":[  
           "insert other stack trace strings here...",
           "...",
           "..."
        ],
        "cause":{
           "errorMessage": "...",
           ...continue in to perpetuity...
        }
     }
}

Поля errorMessage, errorType и stackTrace достаточно легко десериализовать - они будут всегда быть одним String, одним String и List<String> соответственно.

Я застрял в поле cause. Это может быть пустой объект, если нет причины, или одно вложенное исключение, или два, или сотня ...

Как мне десериализовать это? Вот мой POJO.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExceptionRep {
    String errorMessage;

    String errorType;

    List<String> stackTrace;

    // how do I do the cause field?
}

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Определите ваш класс как структуру узла, которая имеет атрибут того же типа:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExceptionRep {
    String errorMessage;
    String errorType;
    List<String> stackTrace;
    private ExceptionRep cause;
}
0 голосов
/ 14 мая 2018

Вы можете использовать HashMap, если не хотите определять все свойства в пользовательском классе.

0 голосов
/ 14 мая 2018

Я бы просто использовал ваш класс ExceptionRep для ссылочного типа и аннотировал бы объект как необязательный (поэтому, если в JSON нет причин, он не потерпит неудачу десериализации).

Что-то вроде:

@JsonProperty(required=false)
ExceptionRep child;

Таким образом, если есть вложенные причины, они рекурсивно десериализуются.Если их нет, свойство игнорируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...