2017-02-08 4 views
1

Ich benutze mongo-java-Treiber in meiner Anwendung zum Lesen und Schreiben von Daten zu mongodb.Schreibe Codec für eingebettete Dokumente in mongodb-java-Treiber

I-Klassen wie diese haben -

public A{ 
    private String a; 
    //Getters & Setters 
} 

public class B{ 
    private String b; 
    private List<A> a; 
    //Getters & Setters 
} 

public class C{ 
    private String c; 
    private B b; 
    //Getters & Setters 
} 

I Codec für die Klassen C, wie diese erstellt haben -

public class CCodec implements Codec<C> { 

    private Codec<Document> documentCodec; 

    public CCodec(CodecRegistry registry) { 
     documentCodec = registry.get(Document.class); 
    } 

    @Override 
    public void encode(BsonWriter writer, C c, EncoderContext context)  { 
     Document document = new Document(); 
     document.put("c",c.getC()); 
     document.put("b",c.getB()); 
     documentCodec.encode(writer, document, context); 
    } 
} 

Codec für Klasse B -

public class BCodec implements Codec<B> { 

     private Codec<Document> documentCodec; 

     public CCodec(CodecRegistry registry) { 
      documentCodec = registry.get(Document.class); 
     } 

     @Override 
     public void encode(BsonWriter writer, B b, EncoderContext context)  { 
      writer.writeStartDocument(); 
      writer.writeString("b",b.getB()); 
      //How to encode A Here 
      writer.writeEndDocument(); 
     } 
    } 

kann ich nicht mache das Codieren in BCodec wie ich es für CCodec getan habe, denn wenn ich sage

Document document = new Document(); 

Es erstellt ein neues Dokument, aber ich wan't es in Dokument C eingebettet haben

Nun ist die Frage, wie eine vom Typ Liste in B-Klasse kodieren i Feld? Siehe encode-Methode der BCodec-Klasse. Ich brauche nicht zu sagen, dass ich den Codec in CodecProvider hinzugefügt habe.

Jede Hilfe wird geschätzt.

Antwort

1

Sie können versuchen, die DocumentCodec.encode Methode wie folgt -

@Override 
public void encode(BsonWriter writer, B b, EncoderContext context) { 
    org.bson.Document bsonDocument = new org.bson.Document(); 
    List<A> a = B.getA(); 
    bsonDocument.put("a", a); 
    ... 
    documentCodec.encode(writer, bsonDocument, encoderContext); 
} 

und wie Sie decode:

@Override 
public B decode(BsonReader reader, DecoderContext decoderContext) { 
    org.bson.Document bsonDocument = documentCodec.decode(reader, decoderContext); 
    B b = new B(); 
    b.setA((List)bsonDocument.getString("a")); 
    ... 
    return b; 
} 
+0

Wie unterscheidet es sich von einem i oben geschrieben haben? –

+0

@RaviKumar ** // Wie kodiere ich A Hier ** in Ihrem Code ist, was beantwortet wurde. * Wie kodiere ich Feld a vom Typ Liste in B-Klasse? * ist, wo ich das codierte 'A' in eine Liste geworfen habe, während ich das' B' decodiert habe. – nullpointer

Verwandte Themen