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

REST API : Using @QueryParam to load data from MongoDB

对于 Jersey 的 restful 服务,我没有找到如何使用 @QueryParam 从 MongoDB 加载数据,否则我希望能够通过传递用户 ID 来搜索用户在 url 中: localhost:9999/home/users/user?id=547ec 这应该为 id=547ec 的用户加载特定数据。

这是我的代码,它 returns 一个空白页:

@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. _id != id。在 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. 这不是问题,只是设计偏好的问题,但我会改用 @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 是线程安全的,因此建议只创建一个实例,而不是像您目前正在为每个请求创建一个实例。