使用 Spring REST 文档记录分层 JSON 负载

2024-02-08

我开始使用Spring REST 文档 http://projects.spring.io/spring-restdocs/记录一个简单的 REST API。我有一个具有某种层次结构的有效负载,例如这样(有员工的公司)。

{
    "companyName": "FooBar",
    "employee": 
    [
        {
            "name": "Lorem",
            "age": "42"
        },

        {
            "name": "Ipsum",
            "age": "24"
        }
    ]
}

我想将公司对象(员工姓名和数组)和员工对象(员工姓名和年龄)的文档分开。

使用org.springframework.restdocs.payload.PayloadDocumentation.responseFields就像解释的那样here http://docs.spring.io/spring-restdocs/docs/1.0.0.RC1/reference/html5/#documenting-your-api-request-response-payloads迫使我记录所有字段,但万一我只想记录employee字段 - 我怎样才能实现这一目标?

我可以在没有员工详细信息的情况下记录公司,因为如果字段是文档,则后代也被视为已记录。但我无法单独记录员工结构,并且在没有公司根对象的情况下,我没有该结构的专用有效负载。


受这个问题的启发,我实现了一项增强功能,使原始答案(见下文)变得过时。

如果您使用 1.0.0.BUILD-SNAPSHOT(可从https://repo.spring.io/libs-snapshot https://repo.spring.io/libs-snapshot),您现在可以将字段标记为忽略。忽略字段计数已被记录,但实际上并未出现在文档中。

考虑到您想要分离文档,进行两个文档调用是有意义的。在第一个中,您可以记录公司名称和员工名单。在第二个中,您记录员工数组并将公司名称标记为忽略。

你的测试看起来像这样:

mockMvc.perform(get("/company/5").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(document("company",
                responseFields(
                        fieldWithPath("companyName").description(
                                "The name of the company"),
                        fieldWithPath("employee").description(
                                "An array of the company's employees"))))
        .andDo(document("employee",
                responseFields(
                        fieldWithPath("companyName").ignored(),
                        fieldWithPath("employee[].name").description(
                                "The name of the employee"),
                        fieldWithPath("employee[].age").description(
                                "The age of the employee"))));

您最终会得到两个片段目录,其中一个名为company和一个名叫employee。然后您可以使用response-fields.adoc每个片段。

原答案

当您记录请求或响应时,没有明确支持忽略字段,但我认为您可以通过使用预处理器删除您不想记录的字段来实现您想要的目的。

鉴于您想要分离文档,有两个document打电话是有道理的。在第一个中,您可以记录公司名称和员工名单。在第二步中,您需要预处理删除公司的请求,然后记录员工数组。

你的测试看起来像这样:

mockMvc.perform(get("/company/5").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(document("company",
                responseFields(
                        fieldWithPath("companyName").description(
                                "The name of the company"),
                        fieldWithPath("employee").description(
                                "An array of the company's employees"))))
        .andDo(document("employee",
                preprocessResponse(removeCompany()),
                responseFields(
                        fieldWithPath("employee[].name").description(
                                "The name of the employee"),
                        fieldWithPath("employee[].age").description(
                                "The age of the employee"))));

注意使用preprocessResponse在第二document call. removeCompany返回一个使用自定义的预处理器ContentModifier从响应中删除公司名称:

private OperationPreprocessor removeCompany() {
    return new ContentModifyingOperationPreprocessor(new ContentModifier() {

        @Override
        public byte[] modifyContent(byte[] originalContent, MediaType contentType) {
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                Map<?, ?> map = objectMapper.readValue(originalContent, Map.class);
                map.remove("companyName");
                return objectMapper.writeValueAsBytes(map);
            }
            catch (IOException ex) {
                return originalContent;
            }
        }

    });
}

您最终会得到两个片段目录,其中一个名为company和一个名叫employee。然后您可以使用response-fields.adoc每个片段。

虽然上述方法可行,但比实际需要的要困难。我已经打开了an issue https://github.com/spring-projects/spring-restdocs/issues/143这样就不再需要修改响应内容的预处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Spring REST 文档记录分层 JSON 负载 的相关文章

随机推荐

  • 以编程方式设置 LinearLayout 分隔线大小

    我已经尝试了多种解决方案 但似乎没有一个有效 我目前正在使用以下Drawable作为分隔线 这是水平示例 但相同的方法也适用于垂直 将高度切换为宽度 LinearLayout linearLayout set with findViewBy
  • 使用 ?与 sed

    我只想获取可能经过 gzip 压缩或未经过 gzip 压缩的文件的编号 但是 sed 中的正则表达式似乎不支持 这是我尝试过的 echo file 1 gz sed n s gz 1 p 并没有返回任何东西 然后我添加了一个 到正在分析的字
  • Julia:矢量化代码与非矢量化代码

    据我了解 Julia 应该使 for 循环更快 并且与矢量化操作一样快 我编写了一个简单函数的三个版本 该函数使用 for 循环与矢量化操作与后者使用 DataFrame 来查找距离 x rand 500 y rand 500 a rand
  • YouTube 数据 API 每日最大查询配额已降至 0,且无法设置任何数字

    我们的项目每天的查询配额限制突然降至 0 Google 没有任何解释 我们正在为我们的项目使用 YouTube Data API 并且即将发布该应用程序 因此我们要求 YouTube 增加每天的查询配额限制 然而 三天后就降为0 没有任何明
  • ag-grid 使用单个 gridOptions 在同一页面中多个实例

    我在我的应用程序中使用 ag grid 我想在同一页面上使用具有两个网格的网格选项的相同实例 ag grid 仅渲染其中一个网格 而将另一个网格留空 这个 plnkr 显示了这个问题 http plnkr co edit 4rRNRGbUo
  • 在延迟加载模块中使用 Angular 组件

    我想在应用程序的多个部分中使用 Angular 组件 包括在延迟加载模块内的组件中 我不知道如何声明在惰性模块中使用它的组件 我将向您展示不同文件的一些相关部分 应用程序模块 ts import FpgTimeComponent from
  • Android Room Dao:按案例排序不起作用

    我有一个 Room 数据库 使用 Dao 来处理查询等 我使用静态 非实时数据 函数通过查询检索结果 当我手动硬编码 Order By 值和列时 一切正常 如下所示 但是在传递参数时到 Dao 进行排序时 Order By 恢复为默认值 按
  • Android,如果内容已经下载到ListView中,如何停止再次读取getView()函数

    我是一个 Android 新手 我有一个 ListView 在 ListView 的每个元素上显示图像 它工作正常 但是当我开始滚动时 我意识到如果我的图像显示在我的手机设备的屏幕上 我会再次下载它 我怎样才能停止重新加载 ListView
  • 如何查看HashMap中键的分布?

    使用哈希映射时 将键均匀分布在存储桶上非常重要 如果所有键最终都在同一个存储桶中 那么您最终会得到一个列表 有没有一种方法可以 审核 Java 中的 HashMap 以查看键的分布情况 我尝试对其进行子类型化并迭代Entry
  • 如何编译Boost.Process库?

    所以有Boost Process 2006 http www netbsd org jmmv process 和最近的通过查看来源 Boost Process 看起来像是 2009 年 http www highscore de boost
  • WPF 几何(路径)部分填充的形状

    这个想法是获得评级控制 其值可以是 0 3 并将其绘制为部分填充的形状 CodeProject 文章中描述了我使用的方法 有Path 添加蒙版 矩形 添加轮廓 使用的原始代码Margin对于掩码和固定宽度路径 问题是使用矩形作为蒙版会重新绘
  • WPF ListBox 将 ItemsSource 与 MVVM-light 绑定

    XAML
  • 我的应用程序可以收到有关 Google 云端硬盘文件夹中的文件更新的通知吗?

    我希望每当在我的 Google Drive 目录 或子目录 上添加 删除或修改文件时 我的应用程序都会收到通知 Google Drive 是否支持网络钩子或类似的第三方集成机制 我在 API 文档中找不到类似的内容 提前致谢 我们现在支持针
  • 使用实体框架,代码优先,无自动增量

    public class Movie public int Id get set Required StringLength 255 public string Name get set public virtual IList
  • 将 Neo4j 子图加载到 Networkx 中

    我一直通过 python 的 Bulbflow 处理 Neo4j 现在需要一种保存 导出子图的方法 我见过 Java 甚至 Ruby 方法来做到这一点 但是简单的 Python 方法似乎对我隐藏着 到目前为止 我已经找到了两条可能的路径 访
  • 简单 Karma + Typescript 配置 - 参考错误:x 未定义

    我想使用 Karma 设置一个基本的测试运行程序来测试 Typescript 类 当我运行测试时karma start 我收到错误ReferenceError Calculator is not defined 据推测 karma 运行程序
  • 禁用检查复选框 (Jquery)

    目的是 如果复选框被禁用 则不执行任何操作 如果启用并选中复选框 请设置按钮的样式 这是我到目前为止所得到的 document ready function e checkbox live click function if this ha
  • 在 GitHub 上查看文件的 GitHub 字符限制或行长度是多少?

    我只是想知道在任何 GitHub 源代码视图页面上可以查看多少个字符而不会溢出 水平滚动 On OS X v10 9 http en wikipedia org wiki OS X Mavericks 小牛队 谷歌浏览器 125 火狐 12
  • 如果我从 .NET 4.0 升级到 4.5 会遇到任何问题吗?

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Spring REST 文档记录分层 JSON 负载

    我开始使用Spring REST 文档 http projects spring io spring restdocs 记录一个简单的 REST API 我有一个具有某种层次结构的有效负载 例如这样 有员工的公司 companyName F