2017-02-23 6 views
1

J'utilise une API Java que je ne possède pas et que je ne peux pas modifier. Cette API définit une classe Aggregation qui est une classe abstraite Immutables (immutables.github.io) avec la sérialisation et la désérialisation de Jackson.Jackson Subclass serialization

La classe ressemble

@Value.Immutable 
@JsonSerialize(as = Immutable_Aggregation.class) 
@JsonDeserialize(as = Immutable_Aggregation.class) 
public abstract class Aggregation { 

Je veux ajouter un champ à l'agrégation qui doit être pris au moment de la sérialisation, mais les cas dont on peut encore être transmise aux méthodes d'accepter Aggregation.

Je veux faire quelque chose comme:

public abstract class ExtendedAggregation extends Aggregation {} 

Est-ce possible?

Répondre

1

Je n'ai pas réussi à hériter entre deux classes marquées @Value.Immutable comme vous le souhaitez, j'ai donc essayé d'utiliser Jackson pour résoudre le problème à la place.

Nous avons trouvé l'approche suivante, qui utilise l'annotation @JsonAppend et les mixins pour ajouter des propriétés sans toucher la classe Aggregation.

D'abord, définir un mélange en classe avec l'annotation:

@JsonAppend(
    attrs = { 
     @JsonAppend.Attr(value = "version") 
}) 
public class AggregationMixin {} 

Inscrivez-vous mixin avec votre ObjectMapper exemple:

mapper.addMixIn(Aggregation.class, AggregationMixin.class); 

sérialiser la classe en créant un ObjectWriter dédié, dans lequel vous spécifiez la valeur de la propriété ajoutée:

ObjectWriter writer = om.writerFor(Aggregation.class).withAttribute("version", "42"); 
...  
String output = writer.writeValueAsString(aggregationInstance); 

L'annotation @JsonAppend peut être configurée pour obtenir sa valeur de plusieurs façons. Consultez sa documentation pour plus de détails.

Quelques lectures complémentaires:

http://www.baeldung.com/jackson-advanced-annotations#jsonappend http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

Cela me semble bon – marisbest2