我正在使用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
,Title
和YearProduced
属性的较短形式的对象 - 而第二条路线则会返回完整的对象。
我希望这很容易解决,但是我不是一个交易的Java人,并希望有注释或某种帮助来协助。
编辑:如果没有,我怀疑最简单的方法是创建一个摘要类(即:MovieSummary
)并将其返回。
答案 0 :(得分:2)
我认为你的建议很好。您可以创建一个辅助对象来表示API将返回的内容。这称为DTO。您可以只为一个实体对象创建多个DTO,我认为这是您的情况。例如,在索引上返回MovieSummaryDTO
,在其他任何地方返回MovieDTO
。
此外,您可以将所有注释以及通常不属于数据访问层的任何“内容”放入此新对象中。因此,在某种程度上,这有助于分离关注点并使您的实体对象保持非常干净。
然而,这引入了一个新问题:现在你必须在实体和DTO之间进行转换。
可以这样做:
我想补充一点,在序列化时可以忽略某些属性。如果您正在使用Jackson(您应该使用),则可以使用@JsonIgnore
注释属性,并且该属性不会被序列化。
但是,我认为这不是你需要的,因为有时你想忽略额外的属性,但有时你却不这样做。
希望这有帮助。快乐的编码!