Jackson
по умолчанию сериализует все getters
метод в данном POJO
.Если мы хотим сериализовать 3-rd party
классы, нам нужно позаботиться о циклах и других проблемах.Для этого мы можем использовать MixIn
функцию .Нам нужно определить, что для всех NestedRuntimeException
исключений мы хотим игнорировать getMostSpecificCause
метод.
interface NestedRuntimeExceptionMixIn {
@JsonIgnore
Throwable getMostSpecificCause();
}
Пример использования:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.core.NestedRuntimeException;
import org.springframework.http.HttpStatus;
import org.springframework.web.client.HttpServerErrorException;
public class JsonApp {
public static void main(String[] args) throws Exception {
HttpServerErrorException exception = new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "error");
ErrorInformation ei = new ErrorInformation(exception);
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.addMixIn(NestedRuntimeException.class, NestedRuntimeExceptionMixIn.class);
System.out.println(mapper.writeValueAsString(ei));
}
}
печатает:
{
"exception" : {
"cause" : null,
"stackTrace" : [ {
"methodName" : "main",
"fileName" : "JsonApp.java",
"lineNumber" : 13,
"className" : "JsonApp",
"nativeMethod" : false
} ],
"rawStatusCode" : 500,
"statusText" : "error",
"responseHeaders" : null,
"statusCode" : "INTERNAL_SERVER_ERROR",
"responseBodyAsByteArray" : "",
"responseBodyAsString" : "",
"message" : "500 error",
"rootCause" : null,
"localizedMessage" : "500 error",
"suppressed" : [ ]
}
}