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

SpringRestDoc mockmvc 2.0.0.RELEASE出现SnippetException问题求助

解决Spring RestDocs 2.0.0.RELEASE中SnippetException:未找到listName[].k1字段的问题

这个报错的核心原因是Spring RestDocs默认会忽略响应体中值为null的字段。你的响应里listName数组的第一个元素k1是null,RestDocs在解析时会跳过这个null字段,导致它认为整个数组元素里不存在k1路径,进而抛出找不到字段的异常。

下面是两种可行的解决方案:

方案一:全局配置响应字段Snippet不忽略Null字段

在你的测试类的初始化方法中,通过documentationConfiguration配置响应字段Snippet的处理器,关闭忽略null值字段的默认行为:

@Before
public void setUp() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
            .apply(documentationConfiguration(this.restDocumentation)
                    .snippets()
                    .withResponseFieldsSnippetConfigurer(configurer -> 
                        configurer.ignoringNullFields(false) // 关键配置:不忽略Null字段
                    ))
            .build();
}

这样配置后,RestDocs会识别到即使字段值为null,该字段也是存在的,就不会再抛出找不到字段的异常了。

方案二:针对单个字段显式声明为可选并指定类型

如果你不想全局修改配置,也可以在声明响应字段时,明确标记listName[].k1为可选字段,并指定它可能的类型(适配你的场景中k1可能为null或字符串的情况):

@Test
public void bugEndpointTest() throws Exception {
    this.mockMvc.perform(get("/bug")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andDo(document("bug-endpoint",
                    responseFields(
                            fieldWithPath("listName").description("The list of items"),
                            fieldWithPath("listName[].k1")
                                    .description("The k1 field (may be null)")
                                    .optional() // 标记字段为可选
                                    .type(JsonFieldType.STRING) // 指定类型,覆盖null和字符串场景
                    )
            ));
}

这个方案更灵活,适合只针对个别字段调整的场景。

另外补充一点:你用匿名内部类返回的listName是public字段,Jackson能正常序列化没问题,但如果后续换成实体类,记得确保字段的访问权限或添加getter方法,避免序列化问题影响RestDocs解析。

内容的提问来源于stack exchange,提问作者user2877911

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:18:33