对于我使用Jersey的restful服务,我没有找到如何使用@QueryParam从MongoDB加载数据,否则我希望通过在url中传递用户id来搜索用户:localhost:9999/home/users/user?id=547ec这应该加载id=547sec的用户的特定数据。
这是我的代码,它返回一个空白页:
@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;
}
-
CCD_ 1。在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();
-
这不是问题,只是设计偏好的问题,但我会使用
_id != id
0,只将id放在路径中,而不是查询参数中。所以@Path("/{id}") public Sting yourMethod(@PathParam("id") String id) // then use .../hello/users/3298ru2390r8
Put可能看起来像
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
是线程安全的,因此建议只创建一个实例,而不是像当前那样为每个请求创建一个。