2015-02-10 55 views
2

爲我與澤西的寧靜服務,我沒有找到如何使用@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
  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