使用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?
}
答案 0 :(得分:0)
我只是将您的ExceptionRep
类重用为引用类型,并将该对象注释为可选(因此,如果JSON中没有原因,则它不会失败反序列化)。
类似的东西:
@JsonProperty(required=false)
ExceptionRep child;
这种方式如果存在嵌套原因,则会递归反序列化。 如果没有,则忽略该属性。
答案 1 :(得分:0)
将您的类定义为具有相同类型属性的节点结构:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExceptionRep {
String errorMessage;
String errorType;
List<String> stackTrace;
private ExceptionRep cause;
}
答案 2 :(得分:0)
如果您不想在自定义类中定义所有属性,则可以使用HashMap。