2014-01-22 47 views
1

我有一個帶有Jersey REST端點的Java web服務,它返回一個Restaurant POJO列表作爲JSON對象(參見下面的Restaurant類)。端點看起來像這樣如何返回Jersey REST api中的部分實體/ POJO

/api/restaurants 

並返回所有綁定到Restaurant類的數據。不過,我想補充另一個更瘦終端,看起來像這樣

/api/restaurants/name 

只針對所有餐廳返回餐廳POJO的idname。是否有一種很好的方式可以在澤西島開箱即用(例如,指定您希望從POJO獲得特定端點的字段)?

相應的POJO看起來是這樣的:

@XmlRootElement 
public class Restaurant { 
    // Members 
    private Long id; 
    private String name; 
    private List<Menu> menus; 
    ... 


    // Constructors 
    public Restaurant() {} 
    ... 


    // Getters and setters 
    ... 
} 

如果您有什麼需要,請不要猶豫,讓我知道!謝謝!

回答

1

是的,Jersey支持選擇包含在序列化XML/JSON中的元素。看一下手冊的entity filtering部分。

本質上,您使用自定義註釋在POJO中註釋了特定的@XmlElements。在您的REST資源中,當您構建Response時,將註釋傳遞給Jersey。

請注意,這僅適用於使用EclipseLink MOXy作爲JAXB提供程序的情況。

+0

這正是我所尋找的只是我不知道它叫什麼!很難找到答案(在文檔或其他方式),當你不知道如何問這個問題:) 謝謝! – bobbyberg

0

首先,我猜測你的API將是

/API /餐廳/ {restaurantId} /名稱

,而不是

/API /餐廳/名稱

而對於你的問題耶爾我有這個功能,我不確定。雖然,這是一個更容易處理這個問題的方法。

內,您的POJO,你可以做這樣的事情:

public class Restaurant { 
// Members 
private Long id; 
private String name; 
private List<Menu> menus; 
... 


// Constructors 
public Restaurant() {} 
... 


// Getters and setters 
... 
// For getting only id and name 
public Map getIdAndName() 
{ 
    Map<Object, Object> map = new HashMap<>(); 
    map.put("id", this.id); 
    map.put("name", this.name); 
    return map; 
} 
// For getting just a list of menu and name 
public Map getNameAndMenu() 
{ 
    Map<Object, Object> map = new HashMap<>(); 
    map.put("menus", this.menus); 
    map.put("name", this.name); 
    return map; 
} 

而且在服務類中,你幾乎可以使用這樣的事情

@Path("/api/restaurants/{restaurantId}/name") 
@Produces("application/json") 
public String getRestaurantName(@PathParam("restaurantId") String restaurantId) 
{ 
    // GET RESTAURANT 
    Restaurant restaurant = getRestaurant(restaurantId); 
    Gson gson = new Gson(); 
    // CONVERT TO JSON AND RETURN (or let jersey do that serializable, whichever way is preferable to you. 
    return gson.toJson(restaurant.getIdAndName()); 
} 

希望這有助於!

+0

這不是我正在尋找的東西,但我想我的問題可能很奇怪(從RESTful的角度來看)。您使用方法的方法絕對可行,所以謝謝!經過一番研究之後,似乎可能的解決方案就是從DAO層做到這一點。例如,如果我只想要某個資源/實體的名稱,我準備一個選擇語句來提取所述名稱(例如SELECT name FROM restaurants)。然後可以將結果集編組到相應的POJO,並將所有不需要的字段設爲無效。從這裏,你可以使用Jersey來不序列化無效字段。 – bobbyberg

+0

請記住,您可能的解決方案(SELECT name FROM restaurants)類型的查詢僅適用於SQL環境(或可能基於某些NoSql數據庫頂部的ORM),因此可能不是通用解決方案。如果您正在處理直接從數據庫中拔出的實體(從NoSql數據庫直接獲取基於實體的文檔),那麼您的解決方案可能無法爲您工作。但是,無論您將數據從何處提取,實體對象中的幫助器方法始終都能正常工作。 PS:空值和空指針異常齊頭並進:)。 – shahshi15