我正在开发一个Java Web服务,允许用户与存储在mongoDB中的数据进行交互(CRUD操作)。从概念上讲,有一件事困扰着我:
Java是面向对象的,您在定义类时永久定义对象的属性,并且不应该在类定义后动态地修改它们。
对于我的Web服务,使用mongoDB是因为文档的结构和内容可能会随时间而变化。
我的印象是mongoDB和Java在灵活性方面并不相似。我没有找到任何来源讨论这个问题。
我考虑过两种不同的解决方案:
第一个解决方案
我的第一个想法是创建如下所示的模型类:
package classes;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Id;
import com.mongodb.DBObject;
@XmlRootElement
public class Plante extends Model{
private ObjectId _id;
private String name;
public Plante(){}
public Plante(String nom){
this.name = nom;
}
public Plante(ObjectId id, String nom){
this._id = id;
this.name = nom;
}
@XmlElement
public String get_id(){
return this._id.toString();
}
@XmlElement
public String getName(){
return this.name;
}
public void setName(String nom){
this.name = nom;
}
public void set_id(ObjectId id){
this._id = id;
}
public Document toDocument(){
Document resultat = new Document();
resultat.put("name", this.getName());
return resultat;
}
}
为了检索数据并插入数据,我有这种类型的功能:
@Override
public <T extends Model> ArrayList<T> findAll() {
ArrayList<T> resultats = new ArrayList<T>();
try {
Gson gson = new Gson();
FindIterable<Document> allDocs = this.collection.find();
for(Document doc : allDocs){
T element;
element = (T) gson.fromJson(doc.toJson(), Class.forName("classes." + nomClasse));
resultats.add(element);
}
}
catch (JsonSyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultats;
}
@Override
public String insert(Model newM){
this.collection.insertOne(newM.toDocument());
return "OK";
}
但是,我觉得这个解决方案并不是很整洁,因为如果有人想添加一个具有新类型属性的Object,我的Web服务就会忽略这个新属性。
我正在使用Jersey(JAX-RS),这是我尝试进行“post”调用时调用的函数:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response postElement(final Plante plante){
return super.post(plante);
}
如果我的代码不清楚,我很抱歉,架构相当复杂,对于理解这个问题并不重要。
第二个解决方案
由于与mongoDB文档相比,POJO并不灵活,我想到了另一种解决方案,我根本就没有任何“Object”类,但是由于调用了URL,我知道用户想要在哪个集合中插入一个对象。 例如:
http://localhost:8080/webservice/plante
在这个网址上有一个GET,我只需将请求正文中收到的JSON直接插入到“plante”集合中。
您对这两种解决方案有何看法?第二个是脏的吗?或者它比第一个更好? 还有其他解决方案吗?
PS :我现在无法真正改变语言,即使Java不是一个好的选择,因为我在实习结束时这个网络服务还做了很多其他的东西。
PS2 :如果我的问题看起来很愚蠢,我很抱歉,我是整个noSQL世界的新手