【发布时间】:2019-01-06 09:32:56
【问题描述】:
使用 Jackson 的 ObjectMapper 将 protobuf 转换为 JSON 时出现以下错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Direct self-reference leading to cycle (through reference chain:
MyObjectPb$MyObject["unknownFields"]->
com.google.protobuf.UnknownFieldSet["defaultInstanceForType"])
MyObjectPb 有以下字段:
protected com.google.protobuf.UnknownFieldSet unknownFields
在处理现有代码库时,我有以下限制:
- 我无法修改 MyObjectPb 的源代码,所以我无法在 MyObjectPb 中使用 Jackson 的忽略注解。
- 我也不能使用 Gson 的库来转换对象,因为代码库已经使用 Jackson 进行序列化。不建议添加新的依赖项。
如何告诉 Jackson 忽略(反)序列化 MyObjectPb 中的 UnknownFieldSet 对象?
我尝试了以下方法,但这些方法似乎无法解决问题:
a) 配置 ObjectMapper:
myObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
b) 使用 Jackson Mixin:
@JsonIgnoreType
private abstract class UnknownFieldSetIgnoreMixIn {}
myObjectMapper.addMixIn(UnknownFieldSet.class, UnknownFieldSetIgnoreMixIn.class)
【问题讨论】:
-
mixin 是我的第一个猜测。您可能必须声明一个并行类以供 JSON 使用。 MapStruct 可以帮助在那里来回转换。
-
@chrylis 请问mixin实现是否合适或者我错过了什么?我会查找 MapStruct,非常感谢。
标签: java json jackson protocol-buffers