簡體   English   中英

無法在 MongoDB 中創建實體

[英]Can´t create entity in MongoDB

我是 MongoDB 的新手,如果問題是基本的,那么抱歉。

我正在嘗試使用 Java 基本對象 (POJO) 獲得基本 CRUD,但此代碼失敗。 (這樣做的正確方法是什么?我認為它可能接近於此):

BasicDBObject document = new BasicDBObject();
document.put("name", user);
dbCollection.insert(document);

這是我收到的消息:

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class entities.users.NormalUser
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:289)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:261)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:226)
    at com.mongodb.DBCollection.insert(DBCollection.java:75)
    at com.mongodb.DBCollection.insert(DBCollection.java:59)
    at com.mongodb.DBCollection.insert(DBCollection.java:104)
    at repositories.UsersRepository.createUser(UsersRepository.java:53)
    at repositories.UsersRepository.main(UsersRepository.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

您不能簡單地使用 mongo java 驅動程序序列化應用程序中的每個類。 要么堅持使用 JSON 文檔及其支持的數據類型(基本上是字符串、各種數字、布爾值、日期),要么實際為類編寫自定義編解碼器,以便內部 Bson 轉換可以使用它。

不幸的是,我在德語中找到了一個基本示例的鏈接: https : //dev-tek.de/lexicon/Entry/64-MongoDB-Anleitung-Custom-codecs-mit-Hilfe-des-DocumentCodecs/ - 但也許代碼有幫助了解。

附錄,關於評論:

基本上,您可以按照以下方式手動進行轉換:

Document doc = new org.bson.Document();
doc.put("userName", user.getName());
doc.put("userId", user.getID());
// ... or whatever your user object looks like
// and then:
dbCollection.insert(doc);

然后,您可以嘗試使用外部編碼庫將您的對象轉換為 JSON,例如 Jackson,如此問題的答案中所述: Converting Java objects to JSON with Jackson

一旦你有一個 JSON 字符串,你可以將它轉換為 org.bson.Document 通過

org.bson.Document.parse(jsonString)

並將其寫入數據庫。

嘗試使用 MongoTemplate。 使用此模板將 java 對象保存在 mongodb 中,它將以文檔形式創建。

https://www.mkyong.com/mongodb/spring-data-mongodb-insert-document/

例子

MongoTemplate mongoTemplate = new MongoTemplate(new MongoClient("<server>"),"<db name>");

User user = new NormalUser();
mongoTemplate.save(user, "<collection>");

以下是對這個問題的詳細分析:-

看起來“lombok”庫在編譯時添加了樣板代碼(即屬性的getter 和setter 方法)。 我在執行程序時觀察到兩種行為。

1) Eclipse 行為:-

當我通過 IDE(例如 eclipse)運行程序時,沒有生成“getter”和“setter”方法。 運行主類時出現序列化錯誤。 我已經反編譯了 User 和 NormalUser 類並檢查了內容。 它沒有“getter”和“setter”方法。

在線 Java 反編譯器

2) Maven 行為:-

我已經使用 maven 命令來構建項目並檢查類 User 和 NormalUser。 這次我可以看到正在生成的樣板代碼。 我已經執行了我的 Main 類並且運行良好。

解決方案:-

MongoClient client = new MongoClient();
        MongoDatabase database = client.getDatabase("localhost");
        MongoCollection<Document> normalUserCollection = database.getCollection("normaluser");

        User normalUser = new NormalUser("jack", "mike", "US", "dni", "123", Gender.MALE);

        Document document = new Document();
        document.put("user", document.parse(new ObjectMapper().writeValueAsString(normalUser)));

使用的 Mongo Java 驅動程序:-

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.2.2</version>
</dependency>
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.5</version>
        </dependency>

輸出:-

該文檔已成功插入到 MongoDB 集合中。

{
    "_id" : ObjectId("57d2e4134c1c7b287cde1d30"),
    "user" : {
        "surname" : "mike",
        "address" : "US",
        "dni" : "dni",
        "bankAccount" : "123",
        "admin" : false,
        "name" : "jack",
        "gender" : "MALE"
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM