Gson va permettre de sérialiser et désérialiser pour passer d'objet java à JSON et inversement :
public class DBOAdapter {
private static Gson gson;
private static Gson getGson() {
if (gson == null) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ObjectId.class, new ObjectIdAdapter());
gsonBuilder.excludeFieldsWithoutExposeAnnotation().setDateFormat("MMMM dd, yyyy HH:mm:ss");
gson = gsonBuilder.create();
}
return gson;
}
public static <T extends Model> T dboToModel(DBObject dbObject, Class<T> clazz) {
gson = getGson();
String json = gson.toJson(dbObject);
return gson.fromJson(json, clazz);
}
public static BasicDBObject objectToDBObject(Object object) {
BasicDBObject obj = (BasicDBObject) JSON.parse(getGson().toJson(object));
return obj;
}
public static DBObject[] objectToDBObjectArray(Object object) {
BasicDBObject[] objects = new BasicDBObject[] { objectToDBObject(object) };
return objects;
}
}
public class ObjectIdAdapter
implements JsonSerializer<ObjectId>, JsonDeserializer<ObjectId> {
@Override
public JsonElement serialize(ObjectId id, Type typeOfT, JsonSerializationContext context) {
JsonObject jo = new JsonObject();
jo.addProperty("$oid", id.toHexString());
return jo;
}
@Override
public ObjectId deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
try {
return new ObjectId(json.getAsJsonObject().get("$oid").getAsString());
} catch (Exception e) {
return null;
}
}
}
Classe à intégrer, à documenter et à tester (Tests unitaires)
public class MyMongo {
protected DB db;
protected MongoClient mongoClient;
private DBCollection collection;
public DB getDb() {
return db;
}
public boolean connect(String dbname) throws UnknownHostException {
return this.connect(dbname, "127.0.0.1", 27017);
}
public boolean connect(String dbname, String server, int port) throws UnknownHostException {
mongoClient = new MongoClient(server, port);
List<String> dbnames = mongoClient.getDatabaseNames();
db = mongoClient.getDB(dbname);
return dbnames.contains(dbname);
}
public DBCollection getCollection(String name) {
return db.getCollection(name);
}
public WriteResult insert(String collectionName, Object object) {
setCollection(collectionName);
return insert(object);
}
public WriteResult insert(Object object) {
return collection.insert(DBOAdapter.objectToDBObject(object));
}
public DBObject findOne() {
return collection.findOne();
}
public DBObject findOne(String collectionName) {
setCollection(collectionName);
return findOne();
}
public DBObject findOne(BasicDBObject query) {
return collection.findOne(query);
}
public DBObject findOne(String collectionName, BasicDBObject query) {
setCollection(collectionName);
return findOne(query);
}
/**
* Retourne tous les documents de la collection
*
* @param collectionName
* @return
*/
public Cursor find(String collectionName) {
setCollection(collectionName);
return find();
}
public Cursor find() {
return collection.find();
}
public WriteResult insert(String collectionName, List<? extends Model> objects) {
setCollection(collectionName);
BasicDBObject[] dbList = new BasicDBObject[objects.size()];
int i = 0;
for (Model m : objects) {
dbList[i++] = DBOAdapter.objectToDBObject(m);
}
return collection.insert(dbList);
}
public void save(String collectionName, List<? extends Model> objects) {
setCollection(collectionName);
for (Model m : objects) {
collection.save(DBOAdapter.objectToDBObject(m));
}
}
public Cursor find(String collectionName, BasicDBObject query) {
setCollection(collectionName);
return find(query);
}
public <T extends Model> List<T> load(Cursor cursor, Class<T> clazz) {
setCollection(clazz.getSimpleName());
List<T> result = new ArrayList<>();
while (cursor.hasNext()) {
result.add(DBOAdapter.dboToModel(cursor.next(), clazz));
}
return result;
}
public <T extends Model> List<T> load(BasicDBObject query, Class<T> clazz) {
return load(find(query), clazz);
}
public <T extends Model> List<T> load(Class<T> clazz) {
return load(find(clazz.getSimpleName()), clazz);
}
public Cursor find(BasicDBObject query) {
return collection.find(query);
}
public void setCollection(String name) {
collection = db.getCollection(name);
}
public List<String> getDbNames() {
return mongoClient.getDatabaseNames();
}
public void close() {
mongoClient.close();
}
public void dropCollection(String name) {
this.setCollection(name);
collection.drop();
}
public void dropCollection(Class<? extends Model> clazz) {
this.dropCollection(clazz.getSimpleName());
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void dropCollections(Class... classes) {
for (Class clazz : classes) {
dropCollection(clazz);
}
}
}