2016-09-09 3 views
0

Я новичок в MongoDB, поэтому извините, если вопрос является основным.Невозможно создать сущность в MongoDB

Я пытаюсь получить базовый CRUD, работающий с базовыми объектами Java (POJO), но этот код не работает. (Что такое правильный способ сделать это, я думаю, что это может быть близко к этому):

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) 
+0

Не могли бы вы добавить некоторые сведения об определении класса пользователя/переменной? – notionquest

+0

@notionquest Конечно, я вскоре обновлю вопрос, спасибо –

+0

@notionquest. Вы можете проверить их здесь на самом деле. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация http://stackoverflow.com/questions/39397029/illegalargumentexception-can%C2%B4t-serialize-class-even-it-implements-serializable –

ответ

1

Вот подробный анализ по данному вопросу: -

Похоже "Ломбок" библиотека добавляет шаблонный код (т.е. геттер и сеттер методы для атрибутов) во время компиляции. При выполнении программы я наблюдал два поведения.

1) поведение Eclipse: -

Когда я запустить программу через IDE (например, Eclipse), то "геттер" и "инкубационных" методы не получают генерироваться. У меня возникла ошибка сериализации при запуске основного класса. Я декомпилировал классы User и NormalUser и проверил содержимое. У него нет методов «getter» и «setter».

Online Java Decompiler

2) Maven поведение: -

Я использовал Maven команды для создания проекта и проверил классы пользователей и NormalUser. На этот раз я вижу, что генерируются коды шаблонов. Я выполнил свой основной класс, и он работал нормально.

Решение: -

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

Монго Java Driver используется: -

<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" 
    } 
} 
+0

Большое спасибо за столь подробный ответ. В конце концов, мне удалось заставить его работать несколько иначе. Не могли бы вы сообщить мне зависимость для «writeValueAsString»? Еще раз спасибо. –

1

Вы не можете просто сериализовать каждый класс у вас есть в вашем приложении с драйвером 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, например, Джексон, подробно описанный в ответе на этот вопрос: Converting Java objects to JSON with Jackson

После того, как у вас есть строка JSON, вы можете преобразовать ее в org.bson.Document через

org.bson.Document.parse(jsonString) 

и напишите это в базе данных.

+0

. Не могли бы вы добавить код, как я могу превратить их в JSON? –

1

Попробуйте использовать 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>"); 
+0

Не могли бы вы добавить код ?. Я не использую Spring, но JAX RS. –

Смежные вопросы