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
相关产品推荐
相关产品推荐

