使用JAX-RS的REST摘要对象

时间:2013-09-18 08:16:11

标签: jax-rs

我正在使用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我想返回一个只包含IDTitleYearProduced属性的较短形式的对象 - 而第二条路线则会返回完整的对象。

我希望这很容易解决,但是我不是一个交易的Java人,并希望有注释或某种帮助来协助。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

可以这样做:

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

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

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