Подтвердить что ты не робот

Как вернуть исходный JSON непосредственно из запроса mongodb в Java?

У меня есть следующий код:

@RequestMapping(value = "/envinfo", method = RequestMethod.GET)
@ResponseBody
public Map getEnvInfo()
{
    BasicQuery basicQuery = new BasicQuery("{_id:'51a29f6413dc992c24e0283e'}", "{'envinfo':1, '_id': false }");
    Map envinfo= mongoTemplate.findOne(basicQuery, Map.class, "jvmInfo");
    return envinfo;
}

Как вы можете заметить, код:

  • Извлекает JSON из MongoDB
  • Преобразует его в объект Map
  • Затем объект Map преобразуется в JSON с помощью Spring MongoData до его возврата в браузер.

Можно ли напрямую вернуть исходный json из MongoDb без прохождения промежуточных шагов преобразования?

4b9b3361

Ответ 1

Там вы можете сделать это прямо сейчас:

1. Используя CollectionCallback on MongoTemplate

Вы можете использовать CollectionCallback для непосредственного обращения к возвращенному DBObject и просто toString() it:

template.execute("jvmInfo", new CollectionCallback<String>() {
  String doInCollection(DBCollection collection) {
    DBCursor cursor = collection.find(query)
    return cursor.next().toString()
  }
}

Я все равно получаю перевод исключений в Spring DataAccessExceptions. Обратите внимание, что это немного хрупкое, так как мы ожидаем, что для запроса будет возвращен только один результат, но, возможно, что-то, о чем вам нужно позаботиться при попытке создать String в любом случае.

2. Зарегистрируйте a Converter от DBObject до String

Вы можете реализовать Spring Converter, чтобы выполнить toString() для вас.

class DBObjectToStringConverter implements Converter<DBObject, String> {
  public String convert(DBObject source) {
    return source == null ? null : source.toString();
  }
}

Затем вы можете использовать конфигурацию XML или переопределить customConversions(), чтобы вернуть new CustomConversions(Arrays.asList(new DBObjectToStringConverter())), чтобы зарегистрировать его с помощью MongoConverter. Затем вы можете просто сделать следующее:

String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");

Я добавлю только что показанный конвертер в Spring Data MongoDB и зарегистрирую его по умолчанию для предстоящего выпуска версии 1.3 GA и вернул исправление обратно в 1.2.x как часть исправления для DATAMONGO-743.

Ответ 2

Как указывает Оливер, вы можете использовать Spring Data для этого, но альтернативой, которую вы можете или не можете предпочесть, было бы использование MongoDB более низкоуровневого Java-драйвера. Обратитесь к документации по MongoDB Java Driver 3.x или MongoDB Java Driver 2.x для получения инструкций по использованию этого драйвера.

В основном, что вам нужно сделать, это:

MongoDB Java Driver 3.x

MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection coll = db.getCollection("testCollection");    
BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");

try (MongoCursor<Document> cursor = collection.find(query).iterator()) {
    while(cursor.hasNext()) {
        System.out.println(cursor.next());
    }
}

MongoDB Java Driver 2.x

MongoClient mongoClient = new MongoClient();
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("testCollection");    
BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");

try (DBCursor cursor = coll.find(query)) {
    while(cursor.hasNext()) {
        System.out.println(cursor.next());
    }
}

Это распечатает все документы в коллекции, которые имеют поле _id со значением 51a29f6413dc992c24e0283e.