Spring HATEOAS JSON API如何在集合响应中添加included字段
Spring HATEOAS JSON API如何在集合响应中添加included字段
我来帮你搞定这个问题!要让Spring HATEOAS JSON API的集合响应里出现included字段,你需要调整实体注解的配置,同时在构建响应时正确关联关联资源,具体步骤如下:
1. 修正实体类的关联注解配置
你之前用@JsonApiRelationship只生成了对象内的relationships字段,是因为没指定序列化模式。需要给关联字段加上serializeMode = JsonApiRelationship.SerializeMode.INCLUDED,这样序列化器会把关联资源放到included中,同时保留关系映射。
修正后的Movie类
public class Movie { @JsonApiId public String id; public String name; // 注意你之前响应里的title可能是笔误,这里统一为name,或者调整实体字段名匹配响应 @JsonApiRelationship(serializeMode = JsonApiRelationship.SerializeMode.INCLUDED) public List<Director> directorList; }
符合JSON:API规范的Director类
关联的Director实体也需要遵循JSON:API规范,添加必要的注解:
public class Director { @JsonApiId public String id; public String name; }
2. 调整Controller的响应构建逻辑
之前直接用CollectionModel.of(movies)可能无法自动收集所有关联资源,建议使用JsonApiCollectionModel并显式传入要包含的关联资源,确保所有Director都被加入included字段:
import static com.toedter.spring.hateoas.jsonapi.MediaTypes.JSON_API_VALUE; import com.toedter.spring.hateoas.jsonapi.JsonApiCollectionModel; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/cont", produces = JSON_API_VALUE) public class MovieController { @RequestMapping("/getMovieList") public JsonApiCollectionModel<Movie> getMovieList() { List<Movie> movies = service.getAllMovies(); // 收集所有关联的Director,去重后传入included List<Director> allDirectors = movies.stream() .flatMap(movie -> movie.directorList.stream()) .distinct() .toList(); return JsonApiCollectionModel.of(movies) .withIncluded(allDirectors); } }
3. 预期的响应结果
完成上述配置后,你会得到包含included字段的JSON:API响应,结构如下:
{ "data": [ { "id": "1", "type": "movies", "attributes": { "name": "Star Wars" }, "relationships": { "directorList": { "data": [ { "id": "1", "type": "directors" } ] } } }, { "id": "2", "type": "movies", "attributes": { "name": "Star Wars2" }, "relationships": { "directorList": { "data": [ { "id": "2", "type": "directors" } ] } } } ], "included": [ { "id": "1", "type": "directors", "attributes": { "name": "George Lucas" } }, { "id": "2", "type": "directors", "attributes": { "name": "J.J. Abrams" } } ] }
额外注意点
- 如果你不想在
data里显示relationships字段,可以把序列化模式改成JsonApiRelationship.SerializeMode.ONLY_INCLUDED,但这不符合JSON:API的常规设计,建议保留关系映射方便客户端关联。 - 确保你的
spring-hateoas-jsonapi:2.1.3版本支持上述配置,该版本已经包含SerializeMode枚举的相关实现。 - 如果关联资源有重复,用
distinct()去重可以避免included字段出现重复条目。
内容来源于stack exchange
相关产品推荐
相关产品推荐

