Как вернуть исходный 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 без прохождения промежуточных шагов преобразования?
Ответы
Ответ 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
.