我有一个带有Jersey REST端点的Java Web服务,它返回一个餐厅POJO列表作为JSON对象(参见下面的餐厅类)。端点看起来像这样
/api/restaurants
并返回与Restaurant类关联的所有数据。但是,我想添加另一个更精简的端点,看起来像这样
/api/restaurants/name
仅返回所有餐厅的餐厅POJO的id
和name
。是否有一种很好的方法可以在泽西岛开箱即用(例如,从POJO中为特定的端点指定所需的字段)?
相应的POJO看起来像这样:
@XmlRootElement
public class Restaurant {
// Members
private Long id;
private String name;
private List<Menu> menus;
...
// Constructors
public Restaurant() {}
...
// Getters and setters
...
}
如果您还有其他需要,请随时告诉我们!谢谢!
答案 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());
}
希望这有帮助!