Jackson のカスタム デシリアライザーに問題があります。デフォルトのシリアライザーにアクセスして、デシリアライズするオブジェクトを設定したいと考えています。ポピュレーションの後、いくつかのカスタム処理を行いますが、最初にデフォルトの Jackson の動作でオブジェクトをデシリアライズしたいと考えています。
これは私が現時点で持っているコードです。
public class UserEventDeserializer extends StdDeserializer<User> {
private static final long serialVersionUID = 7923585097068641765L;
public UserEventDeserializer() {
super(User.class);
}
@Override
@Transactional
public User deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
User deserializedUser = null;
deserializedUser = super.deserialize(jp, ctxt, new User());
// The previous line generates an exception java.lang.UnsupportedOperationException
// Because there is no implementation of the deserializer.
// I want a way to access the default spring deserializer for my User class.
// How can I do that?
//Special logic
return deserializedUser;
}
}
必要なのは、特別なロジックを開始する前に POJO を事前設定できるように、デフォルトのデシリアライザーを初期化する方法です。
カスタムデシリアライザー内からデシリアライズを呼び出す場合シリアライザークラスをどのように構築しても、現在のコンテキストからメソッドが呼び出されるようです。私のPOJOの注釈のため。これにより、明らかな理由でスタック オーバーフロー例外が発生します。
を初期化しようとしましたBeanDeserializer
が、プロセスが非常に複雑で、適切な方法を見つけることができませんでした。AnnotationIntrospector
また、 の注釈を無視するのに役立つかもしれないと考えて、 を無駄にオーバーロードしようとしましたDeserializerContext
。最後にJsonDeserializerBuilders
、Spring からアプリケーション コンテキストを取得するために魔法のようなことをする必要がありましたが、これを使用してある程度成功した可能性があるようです。JsonDeserializer
たとえば、注釈を読み取らずに逆シリアル化コンテキストを構築する方法など、よりクリーンなソリューションにつながる可能性があることを感謝します。