REST API:使用@QueryParam从MongoDB加载数据
问题描述:
为我与泽西的宁静服务,我没有找到如何使用@QueryParam从MongoDB加载数据,否则我想有可能通过传递他的搜索用户id在url中: localhost:9999/home/users/user?id = 547ec这应该加载用户的特定数据id = 547ec。REST API:使用@QueryParam从MongoDB加载数据
这里是我的代码,它返回一个空白页:
@Path("/user")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUserByID(@QueryParam("_id") String id) {
String returnString = "";
BasicDBObject query = new BasicDBObject("_id",id);
DB db = null;
try{
MongoClient mongo = new MongoClient("localhost", 27017);
db = mongo.getDB("mfj");
DBCollection dbc = db.getCollection("user");
DBCursor cursorByID = dbc.find(query);
JSON json =new JSON();
returnString =json.serialize(cursorByID);
}catch (Exception ex){
ex.printStackTrace();
}
return returnString;
}
答
_id != id
。在URL中,您使用的是id
,但@QueryParam
预计为id
。-
new BasicDBObject("_id",id);
是个问题。当您使用ID进行查询时,您应该使用ObjectId
进行查询。所以`new BasicDBObject("_id", new ObjectId(id));
-
你只是得到从
DBCursor
第一DBObject
。你可以把它叫做toString()
来获得JSON。所以DBCursor cursor = collection.find(query); DBObject object = cursor.next(); returnString = object.toString();
-
不是问题,只是一个设计偏好的问题,但我会用一个
@PathParam
来代替,而只是把ID的路径,而不是查询参数。所以@Path("/{id}") public Sting yourMethod(@PathParam("id") String id) // then use .../hello/users/3298ru2390r8
将完全可能看起来像
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.bson.types.ObjectId;
@Path("/users")
public class MongoResource {
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMongoObject(@PathParam("id") String id) throws Exception {
MongoClient mongoClient = new MongoClient("localhost" , 27017);
DB db = mongoClient.getDB("mfj");
DBCollection collection = db.getCollection("user");
BasicDBObject query = new BasicDBObject("_id", new ObjectId(id));
DBCursor cursor = collection.find(query);
DBObject object = cursor.next();
if (object == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return Response.ok(object.toString()).build();
}
}
以下应工作(测试自己),给予547ec
是实际的ID
localhost:9999/home/users/547ec
顺便说一句,MongoClient
是线程安全的,因此建议只为您的每个请求创建一个实例,而不是像您当前正在执行的那样。
谢谢,它工作正常,例如你只需从localhost删除/ home:9999/home/users/547ec。 – 2015-02-10 11:13:40
取决于应用程序路径。我只是假设它是家。但如果它只是'/',那么你是对的。 :-) – 2015-02-10 11:18:15