2017-02-08 20 views
1

Я использую mongo-java-драйвер в своем приложении для чтения и записи данных в mongodb.Write Codec для встроенных документов в mongodb-java-driver

У меня есть классы, как это -

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 
} 

Я создал кодек для классов C, как это -

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); 
    } 
} 

Кодек для класса В -

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(); 
     } 
    } 

я не могу сделать кодирование в BCodec, как я сделал для CCodec, потому что, когда я говорю

Document document = new Document(); 

Он создает новый документ, но я wan't, чтобы он встраивается в документе C.

Теперь вопрос, как я закодировать поле а из списка типа в классе B? См. Метод кодирования класса BCodec. Излишне говорить, что я добавил весь кодек в CodecProvider.

Любая помощь приветствуется.

ответ

1

Вы можете попробовать использовать метод DocumentCodec.encode следующим образом -

@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); 
} 

и как вы 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

Чем он отличается от одного я написал выше? –

+0

@RaviKumar ** // Как кодировать A Здесь ** в вашем коде - это то, на что был дан ответ. * как я кодирую поле a типа List в классе B? *, где я произвел кодировку 'A' в List при декодировании' B'. – nullpointer