Voglio serializzare una classe POJO che non è sotto il mio controllo, ma voglio evitare di serializzare qualsiasi proprietà proveniente dalla superclasse, e non dalla classe finale. Esempio:serializzazione Jackson: come ignorare le proprietà della superclasse
public class MyGeneratedRecord extends org.jooq.impl.UpdatableRecordImpl<...>,
example.generated.tables.interfaces.IMyGenerated {
public void setField1(...);
public Integer getField1();
public void setField2(...);
public Integer getField2();
...
}
si può intuire dal l'esempio che che questa classe è generata da JOOQ, ed eredita da un complesso UpdatableRecordImpl classe base che ha anche alcuni metodi di proprietà simili a fagioli, che causano problemi durante la serializzazione. Inoltre, ho diverse classi simili, quindi sarebbe bene evitare di duplicare la stessa soluzione per tutti i miei POJO generati.
Ho trovato le seguenti soluzioni possibili finora:
ignorare i campi specifici provenienti dalla superclasse utilizzando la tecnica mixin come questo: How can I tell jackson to ignore a property for which I don't have control over the source code?
Il problema di questo è che se i cambiamenti della classe base (Ad esempio, un nuovo metodo getAnything() appare in esso), può rompere la mia implementazione.
implementare un serializzatore personalizzato e gestire il problema lì. Questo mi sembra un po 'eccessivo.
Come per inciso, ho un'interfaccia che descrive esattamente le proprietà che desidero serializzare, forse posso mescolare un'annotazione @JsonSerialize (as = IMyGenerated.class) ...? Posso usare questo per il mio scopo?
Ma, dal punto di progettazione pura di vista, la cosa migliore sarebbe di essere in grado di dire jackson che voglio serializzare solo le proprietà della classe finale, e ignorare tutti quelli ereditati. C'è un modo per farlo?
Grazie in anticipo.
Jackson è una biblioteca meravigliosa con una miriade di possibilità di personalizzazione. Mi fa sempre sentire stupido perché non trovo il posto giusto per agganciare il mio comportamento personalizzato. :) Grazie, questo è quello che mi serviva! – Ferenc
La soluzione ottiene il risultato richiesto, ma nasconde o rende difficile conoscere l'elenco delle proprietà serializzate. – jordiburgos
Questa soluzione ha funzionato per me. Tralasciando le complesse classi base di JOOQ, la mia implementazione '' 'hasIgnoreMarker''' è' '' return m.getDeclaringClass(). GetName(). Contains ("org.jooq") || super.hasIgnoreMarker (m) '' ' – Nathan