【发布时间】:2018-10-05 18:01:15
【问题描述】:
我正在尝试使用mapper.writeValueAsString 一般打印任何对象,但是在使用 Mockito 和 Jackson 反序列化对象时我面临着无限递归。我试图反序列化的对象执行对 DB 等的底层 Hibernate 调用,我无法控制类本身。
目前我正在使用以下版本的 Mockito 和 Jackson,但对于较旧的 Jackson 1.X 版本也是如此。
- 模拟:
org.mockito:mockito-all:jar:1.9.5:compile - 杰克逊:
com.fasterxml.jackson.core:jackson-databind:jar:2.9.7:compile
正如指定的,我无法使用 @JsonIgnore 等注释修改底层类,因为它们是不受我控制的外部依赖项。我也无法为我的用户案例创建 mixins,因为我试图一般地打印发送的任何对象的内容。
我已尝试在较旧的 Jackson 版本中将 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;
}
}
在对包含 Log4j 语句的方法运行 Mockito 测试时会看到无限递归终端输出,这些语句又调用 PrintUtil 函数。语句 e.printStackTrace() 在运行测试时开始打印。
发送到此实用程序方法的大多数对象是 JAXB XML 服务响应对象。
【问题讨论】:
-
我看不到mockito在这里的作用是什么?另外,您要序列化的对象是什么?
-
@SergiiBishyr 我已经编辑了我的问题并添加了有关 mockito 和我正在序列化的对象的更多信息。
-
您可能需要查看
@JsonIgnore、@JsonIgnoreProperties或@JsonManagedReference / @JsonBackReference组合,看看哪个最适合您的用例。 -
@TheHeadRush 正如我在问题中所述,我无法向传入的对象添加注释,因为它们不归我所有,它们主要是 JAXB XML 对象,它们本质上是底层 C++ 对象的接口。
标签: java hibernate jackson mockito jackson-databind