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内のUnknownFieldSetオブジェクトを無視(非シリアル化)するようにJacksonに指示するにはどうすればよいですか?
私は以下を試しましたが、これらのアプローチは問題を解決しないようです:
a)ObjectMapperの構成:
myObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
b)ジャクソンミックスインの使用:
@JsonIgnoreType
private abstract class UnknownFieldSetIgnoreMixIn {}
myObjectMapper.addMixIn(UnknownFieldSet.class, UnknownFieldSetIgnoreMixIn.class)
JsonFormatクラス(com.googlecode.protobuf.format.JsonFormat)を使用してprotobufを変換しました。
new JsonFormat().printToString(myObject)
これは私にとって完璧な仕事でした。
Protobufをシリアル化する現在の方法(2018年10月)では、次のように_com.google.protobuf.util.JsonFormat
_を使用します。
_JsonFormat.printer().print(myMessageOrBuilder)
_
私はprotobufオブジェクトの直前に@JsonSerialize(using = MyMessageSerializer.class)
アノテーションを使用して、このクラスを追加しました:
_public static class MyMessageSerializer extends JsonSerializer<Message> {
@Override
public void serialize(Message message, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(JsonFormat.printer().print(message));
}
}
_
これにより、new ObjectMapper().writeValueAsString(wrapperObject)
がprotobufをJSONに適切に変換できるようになりました。
インクルードが_com.googlecode.protobuf.format.JsonFormat
_から_com.google.protobuf.util.JsonFormat
_に変更されました
したがって、protobuf依存関係にformat
パッケージがない場合は、JsonFormat
でutil
を探してみてください。
これを含めると、@ amad-personが提案するようにJava new JsonFormat().printToString(myObject)
を使用できるようになります。