MongoDB Anleitung - Custom codecs mit Hilfe des DocumentCodecs

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Registriere dich um viele Vorteile zu genießen! Weniger Werbung, bessere Kommunikation und vieles mehr!

  • In dieser Anleitung wird gezeigt, wie man mit Hilfe von Codecs beliebige Objekte direkt in eine Datenbank einfügen kann. Dabei wird der DocumentCodec verwendet.

    In Zukunft folgt evtl. euch noch ein Tutorial welches ein wenig effizienter ohne den DocumentCodec arbeitet.
    MongoDB-Version: Java-Driver 3.2.0

    Da in diesem Tutorial mehrere Methoden/Klassen aus dem MongoDB-Java-Driver verwendet werden, werden Java-Kenntnisse und der grobe Umgang mit der MongoDB-Java-API benötigt.

    1. Schritt

    Zunächst müssen wir eine Klasse erstellen, welche das Interface org.bson.codecs.Codec<T> implementiert. Als Generic Parameter übergeben wir die Klasse, die wir für diesen Codec verwenden wollen. In meinem Fall habe ich mir eine einfache Klasse als Bespiel erstellt:
    Testklasse

    Java-Quellcode

    1. public class MyCustomClass {
    2. private final String name;
    3. public MyCustomClass(String name) {
    4. this.name = name;
    5. }
    6. public String getName() {
    7. return name;
    8. }
    9. }
    Alles anzeigen

    Die unfertige Codec-Klasse

    Java-Quellcode

    1. public class MyCustomClassCodec implements Codec<MyCustomClass> {
    2. }


    2. Schritt

    Im nächsten Schritt lege ich mir eine statische Instanz der Klasse org.bson.codecs.DocumentCodec an. Man kann das ganze auch mit dem von MongoDB "natürlich" übergebenen Writer/Reader lösen, jedoch werde ich mich einfachheitshalber auf den DocumentCodec beschränken. Außerdem erstelle ich noch ein Felder, um die Feldnamen klar zu haben - in meinem Fall ist jetzt nur ein Feld, da meine Beispielklasse nur das Feld "name" besitzt.
    Codec-Klasse mit statischer DocumentCodec-Instanz und Namensfeld


    Java-Quellcode

    1. public class MyCustomClassCodec implements Codec<MyCustomClass> {
    2. private static final String NAME_FIELD = "name";
    3. private static DocumentCodec documentCodec;
    4. static {
    5. documentCodec = new DocumentCodec(); //Initialisierung mit Konstruktor ohne Parameter
    6. }
    7. }

    Danach müssen wir 3 Methoden implementieren und diese befüllen. Ihr müsst das dann natürlich an eure Klasse anpassen.
    Codec-Klasse mit Methoden


    Java-Quellcode

    1. public class MyCustomClassCodec implements Codec<MyCustomClass> {
    2. private static final String NAME_FIELD = "name";
    3. private static DocumentCodec documentCodec;
    4. static {
    5. documentCodec = new DocumentCodec();
    6. }
    7. @Override
    8. public MyCustomClass decode(BsonReader bsonReader, DecoderContext decoderContext) {
    9. Document document = documentCodec.decode(bsonReader, decoderContext); //Wir lassen uns ein Document aus dem BsonReader vom DocumentCodec "decoden"
    10. String name = document.getString(NAME_FIELD); // Wir holen die benoetigten Parameter und geben eine neue Instanz der Klasse zurueck
    11. return new MyCustomClass(name);
    12. }
    13. @Override
    14. public void encode(BsonWriter bsonWriter, MyCustomClass myCustomClass, EncoderContext encoderContext) {
    15. Document document = new Document();
    16. document.append(NAME_FIELD, myCustomClass.getName()); // Wir serialisieren das Objekt mit den passenden Feldern
    17. documentCodec.encode(bsonWriter, document, encoderContext); // Wir lassen den DocumentCodec das Document "encoden"
    18. }
    19. @Override
    20. public Class<MyCustomClass> getEncoderClass() {
    21. return MyCustomClass.class; //Diese Methode dient MongoDB einfach nur, die richtige Klasse fuer ein Objekt zu finden. Wir geben einfach unsere Klasse zurueck
    22. }
    23. }
    Alles anzeigen


    3. Schritt

    Jetzt müssen wir uns noch eine Klasse, welche das Interface org.bson.codecs.configuration.CodecProvider implementiert, erstellen. Ich werde dabei sofort die einzige Methode füllen und mit Kommentaren erklären.
    Unser eigener CodecProvider


    Java-Quellcode

    1. public class MyCustomClassCodecProvider implements CodecProvider {
    2. private static MyCustomClassCodec codec = new MyCustomClassCodec(); // Eine statische Instanz des Codecs
    3. @Override
    4. public <T> Codec<T> get(Class<T> aClass, CodecRegistry codecRegistry) {
    5. if (aClass == MyCustomClass.class) // Wir ueberpruefen, ob es sich um die richtige Klasse handelt
    6. return (Codec<T>) codec; // Wir geben richtigen den Codec zurueck
    7. return null; // Sonst geben wir null zurueck
    8. }
    9. }


    4. Schritt

    Abschließend "builden" wir uns noch die richtigen com.mongodb.MongoClientOptions und übergeben diese im MongoClient. Auch hier müsst ihr das ganze natürlich an eure Bedürfnisse anpassen

    Java-Quellcode

    1. MongoClientOptions options = MongoClientOptions.builder().codecRegistry(CodecRegistries.fromRegistries(
    2. CodecRegistries.fromProviders(
    3. new MyCustomClassCodecProvider()),
    4. MongoClient.getDefaultCodecRegistry())).build();
    5. // Wir uebergeben den von uns erstellten CodecProvider und die von MongoDB bereits implementierte default CodecRegistry.
    6. // Danach fuehren wir die Methode "build" aus und erhalten eine Instanz der MongoClientOptions-Klasse
    7. MongoClient mongoClient = new MongoClient(new ServerAddress(), options);

    5. Schritt

    Nun können wir das Ganze noch testen. Dazu wählen wir zunächst eine Datenbank vom MongoClient aus und holen uns danach die Collection und testen den Codec mit einem einfachen "insert".

    Java-Quellcode

    1. MongoDatabase mongoDatabase = mongoClient.getDatabase("main");
    2. MongoCollection<MyCustomClass> mongoCollection = mongoDatabase.getCollection("maincollection").withDocumentClass(MyCustomClass.class); //Mit der Methode "withDocumentClass" zeigen wir MongoDB, dass wir in dieser Collection nur Objekte des angegeben Typs verwenden
    3. // Jetzt koennen wir unser Objekt ohne Probleme einfuegen
    4. mongoCollection .insertOne(new MyCustomClass("dev-tek")


    Vielen Dank für eure Aufmerksamkeit. Ich hoffe ich konnte euch ein wenig helfen.

    Konstruktive Kritik bitte als Kommentar hinterlassen.

    286 mal gelesen