1

我正在使用 JAX-RS 编写一个 RESTful 接口。目前正在编写索引资源以查看系统中可用的对象。

我的问题是,在用户选择有问题的实际对象之前,返回电影对象的完整表示是昂贵且不必要的。

我的问题:

有没有办法控制 JSON 序列化过程以提供该对象的“短”版本以及长版本 - 或者我最好创建一个 viewmodel-esque 类来表示较短的形式?

使用电影数据库作为我的问题的一个工作示例:

@GET
@Path("/api/movie/")
@Produces(MediaType.APPLICATION_JSON)
public List<Movie> ListMovies() {
    return entityManager.createQuery("FROM Movie", Movie.class).getResultList();
}

@GET
@Path("/api/movie/{movieId}")
@Produces(MediaType.APPLICATION_JSON)
public Movie GetMovie( @PathParam("movieId") Integer movieId ) {
    return entityManager.find(Movie.class,movieId);
}

第一条路线/api/movie我想返回只包含 , 和 属性的对象的较短形式ID-TitleYearProduced第二条路线将返回完整的对象。

我希望这很容易解决,但是我不是一个 Java 人,我希望有注释或某种帮手来帮助解决这个问题。

编辑:如果没有,我怀疑最简单的方法是创建一个摘要类(即:)MovieSummary并返回它。

4

1 回答 1

2

我觉得你的建议很好。您可以创建一个辅助对象来表示您的 API 将返回的内容。这称为DTO。您可以为一个实体对象创建多个 DTO,我认为这是您的情况。MovieSummaryDTO例如,在索引和MovieDTO其他任何地方返回 a 。

此外,您可以将所有注释以及通常不属于数据访问层的任何“东西”放入这个新对象中。因此,在某种程度上,这有助于分离关注点并保持您的实体对象非常干净。

但是,这引入了一个新问题:现在您必须在实体和 DTO 之间进行转换。

这可以做到:

  • 手动 - 您创建执行这些映射的对象,或者直接使用构造函数创建它们
  • 自动/通用 - 有一些库通过反射 API 将一个对象映射到另一个对象。我会建议这些:

我只想补充一点,序列化时可以忽略某些属性。如果您使用的是 Jackson(您应该这样做),您可以使用 注释属性@JsonIgnore,并且该属性不会被序列化。但是,我认为这不是您所需要的,因为有时您想忽略额外的属性,但有时您不想。

希望这有帮助。快乐编码!

于 2013-09-18T08:37:19.787 回答