2017-05-20 1 views
0

J'utilise SpringBoot, Spring Data et MongoRepository pour stocker et récupérer des objets.Deserializer personnalisé utilisant MongoRepository

Lors de l'utilisation de MongoRepository, existe-t-il un moyen de fournir un désérialiseur json personnalisé (de préférence un GSON, qui peut effectuer un travail supplémentaire au lieu du désérialiseur interne)?

Par exemple, je fais appel:

Data data = repo.findOne(id); // where repo is a MongoRepository 

Je voudrais avoir quelques données supplémentaires champs définis de manière personnalisée (les appeler des valeurs de champ dérivées). Je peux bien sûr définir les champs dérivés directement sur l'objet de données ci-dessus, mais ce serait plus propre si je peux accrocher un désérialiseur au moment de la récupération.

Par exemple, sans données de printemps, je peux utiliser les curseurs de MongoDB et crochet gson désérialiseurs comme ci-dessous:

public List<Data> getData() { 
    Gson gson = new Gson(); 
    List<Data> dataRecords = new ArrayList<Data>(); 
    MongoCursor<Document> cursor = db.getCollection("DataCollection").find().iterator(); 
    try { 
     while (cursor.hasNext()) { 
      dataRecords.add(gson.fromJson(JSON.serialize(cursor.next()), Data.class)); 
     } 
    } finally { 
     cursor.close(); 
    } 

    return dataRecords; 
} 

Répondre

1

Une façon cela peut être fait est
1. Les champs que vous souhaitez ajouter (quand le document est désérialisé), déclarez les comme @Transient dans votre entité Data class
2. Mettez ceci dans votre classe d'entité @AccessType(PROPERTY). Cela assurera que vos setters sont utilisés pour désérialiser (par défaut, ce ne sera pas le cas). Ainsi, vos setters sont appelés quand ils essaient de désérialiser (pour les champs non transitoires). Vous pouvez appeler les paramètres pour vos champs transitoires à partir des champs non transitoires.