如何在Jersey REST api中返回部分实体/ POJO

时间:2014-01-22 16:46:58

标签: java rest jersey jackson

我有一个带有Jersey REST端点的Java Web服务,它返回一个餐厅POJO列表作为JSON对象(参见下面的餐厅类)。端点看起来像这样

/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
    ...
}

如果您还有其他需要,请随时告诉我们!谢谢!

2 个答案:

答案 0 :(得分:1)

是的,Jersey支持选择序列化XML / JSON中包含的元素。请查看手册的entity filtering部分。

基本上,您使用自定义注释在POJO中注释特定的@XmlElements。在REST资源中,在构建响应时将注释传递给Jersey。

请注意,这只适用于将EclipseLink MOXy用作JAXB提供程序的情况。

答案 1 :(得分: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());
}

希望这有帮助!