web-dev-qa-db-fra.com

Comment retourner du JSON brut directement à partir d'une requête mongodb en Java?

J'ai le code suivant:

@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;
}

Comme vous pouvez le constater, le code:

  1. Récupère JSON de MongoDB
  2. Le convertit en un objet Map
  3. L'objet Map est ensuite converti en JSON par Spring MongoData avant d'être renvoyé au navigateur.

Est-il possible de retourner directement le json brut de MongoDb sans passer par les étapes de conversion intermédiaires?

26
pdeva

Il y a deux façons de le faire dès maintenant:

1. Utilisation de CollectionCallback sur MongoTemplate

Vous pouvez utiliser un CollectionCallback pour traiter directement le DBObject retourné directement et simplement toString() it:

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

Vous obtiendrez toujours la traduction d'exception dans DataAccessExceptions de Spring. Notez que cela est légèrement fragile car nous nous attendons à ce qu'un seul résultat soit renvoyé pour la requête, mais c'est probablement quelque chose que vous devez prendre en compte lorsque vous essayez de produire un String de toute façon.

2. Enregistrez un Converter de DBObject vers String

Vous pouvez implémenter un Spring Converter pour faire la toString() pour vous.

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

Vous pouvez ensuite utiliser la configuration XML ou remplacer customConversions() pour renvoyer une new CustomConversions(Arrays.asList(new DBObjectToStringConverter())) pour l'enregistrer avec votre MongoConverter. Vous pouvez alors simplement faire ce qui suit:

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

J'ajouterai le convertisseur qui vient d'être montré à Spring Data MongoDB et l'enregistrerai par défaut pour la prochaine version 1.3 GA version et portera le correctif à 1.2.x dans le cadre du correctif pour DATAMONGO-74 .

19
Oliver Drotbohm

Comme le souligne Oliver, vous pouvez utiliser Spring Data pour cela, mais une alternative que vous préférerez peut-être serait d'utiliser le pilote de bas niveau de MongoDB Java Driver. Jetez un œil au - MongoDB Java Driver 3.x ou MongoDB Java Driver 2.x documentation pour obtenir des instructions sur son utilisation) chauffeur.

Fondamentalement, ce que vous devez faire est le suivant:

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

Cela imprimera tous les documents de la collection qui ont un champ _id avec une valeur 51a29f6413dc992c24e0283e.

9
CorayThan