You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:29:29