跳到内容

JSON:API Starter

受众:开发者 摘要:可选 JSON:API Resource Document 表示层。用于开放 API、第三方集成和 SDK 兼容接口,不替代现有 Result

何时使用

场景建议
对外开放 API 需要标准 resource document使用 JSON:API starter 显式返回 JsonApiDocument
第三方同步接口需要 links / meta / included使用 JsonApiResourceJsonApiRelationshipJsonApiLink
错误响应需要标准化 status / code / source使用 JsonApiError
后台、App、PC 普通业务接口继续使用现有 Result,不要全局替换

JSON:API starter 是可选表示层,不接管 Controller、不自动包裹返回值、不绑定 Entity / VO,也不替代 OpenAPI 文档能力。是否采用 JSON:API 应由具体开放接口显式选择。

快速开始

xml
<dependency>
    <groupId>com.springopen</groupId>
    <artifactId>spring-open-starter-json-api</artifactId>
</dependency>
java
JsonApiResource article = JsonApiResource.builder("articles", articleId)
        .attribute("title", "Hello")
        .relationship("author", JsonApiRelationship.toOne(JsonApiResourceIdentifier.of("users", userId)))
        .link("self", "/api/v1/public/articles/" + articleId)
        .build();

return JsonApiDocument.resource(article)
        .withMeta("traceId", traceId);

也可以注入 JsonApiResourceAssembler

java
JsonApiDocument<JsonApiResource> document = assembler.document(
        assembler.resource("articles", articleId)
                .attribute("title", "Hello")
                .build());

模型说明

类型职责
JsonApiDocument<T>Top-level document;约束 dataerrors 不能同时存在
JsonApiResourceResource object;包含 typeidattributesrelationshipslinksmeta
JsonApiResourceIdentifierRelationship data 中的轻量 resource identifier
JsonApiRelationshipto-one / to-many relationship
JsonApiLinkLink object,支持 link-level meta
JsonApiErrorError object,支持 statuscodetitledetailsourcemeta
JsonApiResourceAssemblerSpring Bean 形式的便捷工厂

错误响应

java
JsonApiError error = JsonApiError.builder("404", "article-not-found", "Article not found")
        .detail("No article with id " + id)
        .source("parameter", "id")
        .build();

return JsonApiDocument.errors(List.of(error));

边界

  • 不全局替换 Result
  • 不自动转换 Entity / VO;业务模块自己决定 resource type、attributes 和 relationships。
  • 不负责权限、分页查询、OpenAPI 文档或 HTTP 状态码选择。
  • spring-open-starter-openapi 可并用:OpenAPI 负责文档描述,JSON:API 负责运行时响应形状。

验证

bash
./mvnw -pl spring-open-starters/spring-open-starter-json-api test -DskipITs -DskipFrontend -Dsurefire.failIfNoSpecifiedTests=false
git diff --check -- spring-open-starters/spring-open-starter-json-api docs/zh-CN/json-api.md

Released under the Apache License 2.0.