REST API:使用@QueryParam从MongoDB加载数据



对于我使用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;
}
  1. CCD_ 1。在URL中,您使用的是id,但@QueryParam需要id

  2. new BasicDBObject("_id",id);是一个问题。当您使用id进行查询时,您应该使用ObjectId进行查询。所以

    `new BasicDBObject("_id", new ObjectId(id));
    
  3. 您只需从DBCursor中获得第一个DBObject。您可以直接调用它的toString()来获取JSON。所以

    DBCursor cursor = collection.find(query);
    DBObject object = cursor.next();
    returnString = object.toString();
    
  4. 这不是问题,只是设计偏好的问题,但我会使用_id != id0,只将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是线程安全的,因此建议只创建一个实例,而不是像当前那样为每个请求创建一个。

最新更新