Я пытаюсь распечатать любой объект с помощью mapper.writeValueAsString
, но я сталкиваюсь с бесконечной рекурсией при десериализации объектов с помощью Мокито и Джексона.Объекты, которые я пытаюсь десериализовать, выполняют базовые вызовы Hibernate для БД и т. Д., И я не имею никакого контроля над самими классами.
В настоящее время я использую следующие версии Mockito и Jackson, но то же самое происходит и для старых версий 1.X-версии Джексона.
- Mockito:
org.mockito:mockito-all:jar:1.9.5:compile
- Джексон:
com.fasterxml.jackson.core:jackson-databind:jar:2.9.7:compile
Как указано, я не могу изменять базовые классы с аннотациейтакие как @JsonIgnore
, потому что они находятся за пределами зависимостей, не под моим контролем.Я также не могу создавать миксины для своего пользовательского случая, потому что я пытаюсь распечатать содержимое любого отправляемого объекта.
Я пытался добавить DeserializationConfig FAIL_ON_UNKNOWN_PROPERTIES
к false
в более старой версии Джексона, и япопытался установить DeserializationFeature FAIL_ON_MISSING_CREATOR_PROPERTIES
в false
.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public static PrintUtil {
public static String printJSON(Object obj) {
String printstring = "printfailed";
try {
ObjectMapper mapper = new ObjectMapper();
LOG.debug("formatted JSON String ");
printstring = mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return printstring;
}
}
Вывод терминала бесконечной рекурсии виден при выполнении тестов Mockito для методов, которые содержат операторы Log4j, которые в свою очередь вызывают функцию PrintUtil.Оператор e.printStackTrace()
начинает печатать во время выполнения тестов.
Большинство объектов, отправляемых этому служебному методу, являются объектами ответа службы XML JAXB.