Конвертировать DBObject в POJO с помощью MongoDB Java Driver

MongoDB, похоже, возвращает объекты BSON/JSON.

Я думал, что вы наверняка сможете получить значения в виде строк, целых и т. Д., Которые затем можно сохранить как POJO.

У меня есть DBObject (создается как BasicDBObject) в результате итерации по списку... (cur.next()).

Является ли единственный способ (кроме использования какой-либо среды персистентности) передать данные в POJO для использования Serialialiser / Deserialiser JSON?

Мой метод выглядит так:

public List<User> findByEmail(String email){
         DBCollection userColl;
         try {
            userColl = Dao.getDB().getCollection("users"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace();}
            DBCursor cur = userColl.find();
            List<User> usersWithMatchEmail = new ArrayList<User>();

            while(cur.hasNext()) {
               // this is where I want to convert cur.next() into a <User> POJO
               usersWithMatchEmail.add(cur.next());
            }
        return null;
    }

РЕДАКТИРОВАТЬ: Это довольно очевидно, просто сделайте что-то вроде этого.

5 ответов

Решение

Есть несколько java-библиотек, которые могут вам помочь:

Пусть Spring сделает тяжелую работу с тем, что уже построил для этого...

Настоящий трюк: mongoTemplate.getConverter(). Read(Foo.class, obj);

Например, при использовании DBCursor -

while (cursor.hasNext()) { 
    DBObject obj = cursor.next(); 
    Foo foo = mongoTemplate.getConverter().read(Foo.class, obj);  
    returnList.add(foo); 
}

http://revelfire.com/spring-data-mongodb-convert-from-raw-query-dbobject/

Хотя поздний ответ, кто-то может найти это полезным.

Я использую GSON для конвертации из BasicDBObject на мой собственный POJO, который TinyBlogDBObject

TinyBlogDBObject obj = convertJSONToPojo(cursor.next().toString());

private static TinyBlogDBObject convertJSONToPojo(String json){

    Type type = new TypeToken< TinyBlogDBObject >(){}.getType();

    return new Gson().fromJson(json, type);

}

1. Предоставьте bean-компоненту MongoDatabase правильную CodecRegistry

@Bean public MongoDatabase mongoDatabase() {
    PojoCodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
    CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClient.getDefaultCodecRegistry(), CodecRegistries.fromProviders(pojoCodecProvider));
    MongoClient mongoClient = new MongoClient("localhost", 27017);
    return mongoClient.getDatabase("example_db_name").withCodecRegistry(pojoCodecRegistry);
}

2. Аннотировать POJOS

public class ProductEntity {

    @BsonProperty("name") public final String name;
    @BsonProperty("description") public final String description;
    @BsonProperty("thumb") public final ThumbEntity thumbEntity;

    @BsonCreator
    public ProductEntity(
            @BsonProperty("name") String name,
            @BsonProperty("description") String description,
            @BsonProperty("thumb") ThumbEntity thumbEntity) {
        this.name = name;
        this.description = description;
        this.thumbEntity = thumbEntity;
    }
}

public class ThumbEntity {

    @BsonProperty("width") public final Integer width;
    @BsonProperty("height") public final Integer height;
    @BsonProperty("url") public final String url;

    @BsonCreator
    public ThumbEntity(
            @BsonProperty("width") Integer width,
            @BsonProperty("height") Integer height,
            @BsonProperty("url") String url) {
        this.width = width;
        this.height = height;
        this.url = url;
    }
}

3. Запрос mongoDB и получить POJOS

MongoCollection<Document> collection = mongoDatabase.getCollection("product");
Document query = new Document();
List<ProductEntity> products = collection.find(query, ProductEntity.class).into(new ArrayList<>());

Пожалуйста, проверьте мой ответ в другом посте
POJO для org.bson.Document и наоборот

Вы можете использовать библиотеку GSON, предоставленную Google. Вот пример этого. Есть много других API, которые вы можете использовать для преобразования JSON в Pojo, как API Jettision и т.д.

Другие вопросы по тегам