【问题标题】:Java - Specify fields to return in RESTJava - 指定要在 REST 中返回的字段
【发布时间】:2014-04-20 00:19:10
【问题描述】:

我正在用 Java 实现基于 REST 的服务,但我不想为每个 GET 调用返回 JSON 中的完整实体。

我现在拥有的是这个

@GET
@Path("movie/{id}")
@Produces({"application/json"})
public Movie find(@PathParam("id") Integer id) {
    return getEntityManager().find(Movie.class, id);
}

使用上面的代码,我可以获得由 id 指定的电影的完整 JSON 表示,但是我想做这样的事情:

GET>http://mydomain.com/movie/id=1?fields=title,year

在这里,我传递了电影的id 以及我希望以 JSON 格式的响应返回的字段。

有没有一种简单的方法可以做到这一点,或者现有的图书馆已经做到了这一点?

编辑: 是的,A.J 我最终找到了相同的例子,但我无法让它工作

在该示例中,他们有一个包含所有必要配置的文件

  @ApplicationPath("/")
  public class SelectableEntityFilteringApplication extends ResourceConfig {

  public SelectableEntityFilteringApplication() {
      // Register all resources present under the package.
      packages("org.glassfish.jersey.examples.entityfiltering.selectable");

      // Register entity-filtering selectable feature.
      register(SelectableEntityFilteringFeature.class);

      // Configure MOXy Json provider.
      register(new MoxyJsonConfig().setFormattedOutput(true).resolver());

      property(SelectableEntityFilteringFeature.QUERY_PARAM_NAME, "select");

  }

}

但是由于我使用的是 J2EE,所以我的 IDE 生成的文件是这样的

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {

@Override
public Set<Class<?>> getClasses() {
    //register(SelectableEntityFilteringFeature.class);
    Set<Class<?>> resources = new java.util.HashSet<>();
    addRestResourceClasses(resources);
    return resources;
}

我无法注册课程,我真的需要扩展 ResourceConfig 吗?似乎与 javax.ws.rs.core.Application 不兼容

【问题讨论】:

  • 可能最简单的方法是使用 json 库并自己构建响应;如果您返回一个 json 对象或字符串,您将可以完全控制输出。
  • 是的,但是我必须构建很多 REST 服务,而且我有很多实体,所以如果我为所有实体都这样做,那么在做一些我想做的事情时会消耗很多时间不用思考,直接写。对我来说真的很讨厌 :) 但是作为最后的手段,这是一个选择
  • 嗯,你基本上想要 URI 模板的反面......使用 URI 模板你可以做 http://mydomain.com/movie/id={id}?fields={fields} 其中id 是一个标量,fields 是一个数组,但是 URI 模板定义扩展,它们不定义解析...(有关详细信息,请参阅 RFC 6570)
  • 服务器端使用的是 Jersey 吗?

标签: java json rest field jax-rs


【解决方案1】:

如果您使用的是 Jersey,您可能可以使用它的过滤功能。 以下是文档中相关章节的链接:Entity Filtering

19.5 部分看起来符合您的要求。

注意:我之前没有使用过这个(过滤功能,我确实使用了 Jersey)。 我用谷歌找到了它。所以我不能提供如何使它工作的例子。

编辑:一个例子:https://github.com/jersey/jersey/tree/master/examples/entity-filtering-selectable

【讨论】:

  • 谢谢,这似乎是我想要的,我不明白它是如何工作的,我似乎无法在谷歌上找到一个例子,但我会尝试并报告。
  • 例子似乎不多。我只能找到一个。检查帖子中的编辑。
  • 是的,我也设法找到了,检查我的编辑,我对那个例子有问题
猜你喜欢
  • 1970-01-01
  • 2014-07-26
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多