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; 
} 

  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是线程安全的,因此建议只为您的每个请求创建一个实例,而不是像您当前正在执行的那样。

+0

谢谢,它工作正常,例如你只需从localhost删除/ home:9999/home/users/547ec。 – 2015-02-10 11:13:40

+1

取决于应用程序路径。我只是假设它是家。但如果它只是'/',那么你是对的。 :-) – 2015-02-10 11:18:15