2017-05-15 1 views
0

Je tente de sérialiser une propriété en fonction de la vue. Malheureusement, le code ci-dessous ne fonctionne pas car Jackson signale une propriété getter conflictuelle "userId". Est-il possible d'obtenir un objet en fonction de la vue dans une représentation spécifique?Déstabilisation de Jackson JSON avec des vues

@JsonView(Views.Mongo.class) 
    @JsonProperty("userId") 
    public ObjectId getUserId() { 
     return userId; 
    } 

    @JsonView(Views.Frontend.class) 
    @JsonProperty("userId") 
    public String getUserIdAsString() { 
     return userId.toString(); 
    } 

C'est ce que je veux:

Voir 1:

{ userId: { '$oid' : "16418256815618" } } 

Voir 2:

{ userId: "16418256815618" } 

Répondre

0

Je pense que vous pouvez écrire un sérialiseur personnalisé qui fait cette tâche en fonction sur la vue active comme indiqué ci-dessous.

public class ObjectIdSerializer extends JsonSerializer<ObjectId> { 

    @Override 
    public void serialize(ObjectId objectId, JsonGenerator gen, SerializerProvider provider) throws IOException { 
     if (provider.getActiveView() == Frontend.class) { 
      gen.writeString(objectId.toString()); 
     } else { 
      // Do default serialization of ObjectId. 
      gen.writeStartObject(); 
      gen.writeFieldName("idField1"); 
      gen.writeString(objectId.getIdField1()); 
      gen.writeFieldName("idField2"); 
      gen.writeString(objectId.getIdField2()); 
      gen.writeEndObject(); 
     } 
    } 
} 

ensuite modifier votre POJO comme indiqué ci-dessous

@JsonSerialize(using=ObjectIdSerializer.class) 
public ObjectId getUserId() { 
    return userId; 
} 

Vous ne devez pas passer une annotation de vue sur votre getter/champ tel qu'il est pris en charge dans le sérialiseur personnalisé.

Dans cet exemple, j'ai effectué la sérialisation par défaut manuellement. Alternativement, vous pouvez l'accomplir en utilisant le sérialiseur par défaut en enregistrant un modificateur de sérialiseur comme expliqué dans la question How to access default jackson serialization in a custom serializer.

+0

Merci! Cela a fonctionné pour moi. – user2443205