web-dev-qa-db-fra.com

Insertion de MongoDB Java org.bson.codecs.configuration.CodecConfigurationException: impossible de trouver un codec pour la classe io.github.ilkgunel.mongodb.Pojo

J'apprends MongoDB avec Java. J'essaie d'insérer des données dans MongoDB avec un pilote Java. Je fais l'insertion comme dans MongoDB tutorial et tout va bien. Mais si je veux insérer une variable et quand je lance le code, le pilote lève une erreur comme celle-ci:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class io.github.ilkgunel.mongodb.Pojo.

J'ai fouillé des questions dans Stack Overflow comme ceci, mais je ne comprenais rien et je ne trouvais rien pour résoudre cette erreur. Mon code est ci-dessous. Comment peut résoudre ce problème?

J'utilise ce code:

package io.github.ilkgunel.mongodb;
import org.bson.Document;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import Java.text.DateFormat;
import Java.text.SimpleDateFormat;
import Java.util.ArrayList;
import Java.util.Collection;
import Java.util.List;
import Java.util.Locale;

public class MongoDBBasicUsage {
    public static void main(String[] args) {
        MongoClient mongoClient;
        try {
            Pojo pojo = new Pojo();
            mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase database = mongoClient.getDatabase("MongoDB");

            pojo.setId("1");
            pojo.setName("ilkay");
            pojo.setSurname("günel");

            Document document = new Document();
            document.put("person", pojo);

            database.getCollection("Records").insertOne(document);  
        } catch (Exception e) {
            System.err.println("Bir Hata Meydana Geldi!");
            System.out.println("Hata" + e);
        }
    }
}

Mon Pojo est ceci:

    package io.github.ilkgunel.mongodb;

public class Pojo {
    String name;
    String surname;
    String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    } 
}
9
İlkay Gunel

En vous basant sur ce que vous essayez de faire, vous essayez d’ajouter un type de données personnalisé (dans ce cas, votre POJO), mais vous devez garder à l’esprit que les champs de documents ne peuvent accepter que certains types de données, pas directement des objets .

Si vous ne le saviez pas aussi, les documents Mongo sont structurés de la même manière que json. Vous devez donc créer explicitement les documents en créant les champs et en y insérant les valeurs. Certains types de données sont autorisés dans les champs de valeur: 

http://mongodb.github.io/mongo-Java-driver/3.0/bson/documents/

Pour vous aider avec votre cas, le code ci-dessous prend votre POJO en tant que paramètre et, connaissant la structure du POJO, renvoie un document Mongo pouvant être inséré dans votre collection:

private Document pojoToDoc(Pojo pojo){
    Document doc = new Document();

    doc.put("Name",pojo.getName());
    doc.put("Surname",pojo.getSurname());
    doc.put("id",pojo.getId());

    return doc;
} 

Cela devrait fonctionner pour l'insertion. Si vous souhaitez indexer l'un des champs:

database.getCollection("Records").createIndex(new Document("id", 1));

J'espère que cela répond à votre question et fonctionne pour vous.

11
Dallas Phillips

Vous devez configurer le CodeRegistry pour utiliser PojoCodecProvider comme expliqué ici: http://mongodb.github.io/mongo-Java-driver/3.7/driver/getting-started/quick-start-pojo/

3
Renato Oliveira

Pour être un peu abstrait, cela pourrait sauver la journée à d’autres développeurs.
Cette erreur: CodecConfigurationException: Impossible de trouver un codec pour la classe xxx signifie que votre pilote mongo ne peut pas gérer les données que vous avez envoyées dans l'objet que vous avez créé à partir de cette classe xxx et ne peut donc pas générer la requête de mongo que vous voulez.

La solution dans ce cas serait soit d’utiliser la bonne classe, c’est-à-dire d’utiliser une des classes attendues par le pilote (dans mon cas, le remplacement du tableau Java par l’objet ArrayList résolvait le problème) .. L’autre résolution pourrait être de mettre à niveau votre chauffeur. La troisième solution pourrait être celle mentionnée par @Renato, pour définir votre propre logique de décodage .. Cela dépend de votre cas exact.
hth

0
Hasnaa Ibraheem