当前位置: 首页 > 知识库问答 >
问题:

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

陶树
2023-03-14

我有一个JavaWeb服务,其中包含一个泽西RESTendpoint,它将Restaurant POJO列表作为JSON对象返回(请参阅下面的Restaurant类)

/api/restaurants

并返回与Restaurant类绑定的所有数据。但是,我想添加另一个更精简的endpoint,如下所示

/api/restaurants/name

对于所有餐厅,它仅返回餐厅POJO的id和名称。在Jersey开箱即用中是否有一种很好的方法来实现这一点(例如,为特定endpoint指定您希望从POJO中获得的字段)?

相应的POJO看起来像这样:

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


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


    // Getters and setters
    ...
}

如果你还需要什么,请随时告诉我!谢谢

共有2个答案

仲孙鸣
2023-03-14

首先,我猜想您的api将是

/api/restaurants/{restaurantId}/name

而不是

/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());
}

希望这有帮助!

柴衡
2023-03-14

是的,Jersey支持选择序列化XML/JSON中包含的元素。请参阅手册的实体过滤部分。

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

请注意,这仅在您使用Eclipse Link MOXy作为JAXB提供程序时才有效。

 类似资料:
  • 声明我应该能够使用中选择s.message来查询实体,这确实适用于控制台。 然而,我真正想做的是在返回列表中只返回实体的特定属性,就像这样: 不过,这会出错,根本没有真正的错误消息。我可以看到Hibernate运行了这个查询: 的传统方法工作正常:

  • 我的DTO不同于实体。如何返回带分页的DTO而不是实体,同时仍显示所有页的信息?

  • null 这似乎意味着我不像使用简单的“From customer”查询那样获取customer实体的实例。如果是这种情况,如何返回客户实体?如果没有,那我做错了什么?

  • 我制作了一个返回UserSettings对象数组的服务: 当我在URL http://localhost:8181/settings?ids=123&fields=customdata,user_id上发出GET请求时,我会得到以下信息:

  • 问题内容: 我正在构建RESTful API,并希望为开发人员提供选择以在JSON响应中返回哪些字段的选项。 这篇博客文章显示了几个API(Google,Facebook,LinkedIn)如何允许开发人员自定义响应的示例。这称为部分响应。 一个示例可能看起来像这样: 在上面的示例中,API应该返回用户“ 123”的userId,fullName和title字段。 我正在寻找有关如何在我的REST

  • 我设置了多个这样的父子实体。 在前端,我有一个页面显示一个营表,供用户选择以查看详细信息。此页面依赖于RESTful API,并将存储库和服务类设置为RESTful API。 我的问题是JPARepository的方法不仅返回营条目列表,还返回营链接到的父旅实体,以及每个营包含的所有关联子连。它会使JSON数据膨胀(我不需要表中的所有细节),并使调试时难以读取,更不用说将所有数据转储到客户端的安全