Created
March 29, 2015 16:51
-
-
Save JaiHirsch/08397223c2a0de64dfc8 to your computer and use it in GitHub Desktop.
MongoDB 3.0 java driver Codec example - Codec class for the mapping the Grades bean
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.scratch; | |
import org.bson.BsonReader; | |
import org.bson.BsonString; | |
import org.bson.BsonValue; | |
import org.bson.BsonWriter; | |
import org.bson.Document; | |
import org.bson.codecs.Codec; | |
import org.bson.codecs.CollectibleCodec; | |
import org.bson.codecs.DecoderContext; | |
import org.bson.codecs.DocumentCodec; | |
import org.bson.codecs.EncoderContext; | |
import org.bson.types.ObjectId; | |
public class GradesCodec implements CollectibleCodec<Grades> { | |
private Codec<Document> documentCodec; | |
public GradesCodec() { | |
this.documentCodec = new DocumentCodec(); | |
} | |
public GradesCodec(Codec<Document> codec) { | |
this.documentCodec = codec; | |
} | |
@Override | |
public void encode(BsonWriter writer, Grades value, | |
EncoderContext encoderContext) { | |
Document document = new Document(); | |
ObjectId id = value.getId(); | |
Double score = value.getScore(); | |
Integer studentId = value.getStudentId(); | |
String type = value.getType(); | |
if (null != id) { | |
document.put("_id", id); | |
} | |
if (null != score) { | |
document.put("score", score); | |
} | |
if (null != studentId) { | |
document.put("student_id", studentId); | |
} | |
if (null != type) { | |
document.put("type", type); | |
} | |
documentCodec.encode(writer, document, encoderContext); | |
} | |
@Override | |
public Class<Grades> getEncoderClass() { | |
return Grades.class; | |
} | |
@Override | |
public Grades decode(BsonReader reader, DecoderContext decoderContext) { | |
Document document = documentCodec.decode(reader, decoderContext); | |
System.out.println("document "+document); | |
Grades grade = new Grades(); | |
grade.setId(document.getObjectId("_id")); | |
grade.setStudentId(document.getInteger("student_id")); | |
grade.setType(document.getString("type")); | |
grade.setScore(document.getDouble("score")); | |
return grade; | |
} | |
@Override | |
public Grades generateIdIfAbsentFromDocument(Grades document) { | |
return documentHasId(document) ? document.withNewObjectId() : document; | |
} | |
@Override | |
public boolean documentHasId(Grades document) { | |
return null == document.getId(); | |
} | |
@Override | |
public BsonValue getDocumentId(Grades document) { | |
if (!documentHasId(document)) | |
{ | |
throw new IllegalStateException("The document does not contain an _id"); | |
} | |
return new BsonString(document.getId().toHexString()); | |
} | |
} |
Thanks man!
Thanks! Your example code helped me migrate my Codec from streaming based to document based.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi, this really helped me, thank you very much. However, I am struggling how to serialize/deserialize a Date field.
I have tried using the something like this in the
Codec
implementation:Date timestamp = value.getTimestamp();
However, I still have null results.