Spring Data REST自动生成API的REST Docs自动片段为空问题问询
完全懂你的痛点!用Javadoc自动生成Spring Data REST的API文档确实是能大幅提升自动化效率的好思路,但碰到自动生成的片段大多是空的情况,真的很让人头疼。我之前帮不少开发者解决过类似问题,给你几个关键的排查和解决方向:
检查版本兼容性
不同版本的Spring REST Docs对Spring Data REST的支持程度差异很大,部分旧版本的REST Docs对Spring Data REST的实体字段、查询参数自动解析能力不足,就会导致生成的adoc文件只剩默认的links[]。建议你确保Spring REST Docs版本和Spring Data REST(以及整个Spring Boot生态)匹配:比如Spring Boot 2.7.x对应Spring REST Docs 2.0.x系列,Spring Boot 3.x则对应Spring REST Docs 3.x版本。规范实体类与Repository的Javadoc注释
Spring REST Docs的自动生成逻辑完全依赖Javadoc中的信息,如果只给Repository加了@RepositoryRestResource注解,但实体字段、Repository查询方法都没写Javadoc,生成的片段自然是空的。给你个规范示例:/** * 用户核心实体类 */ public class User { /** * 用户唯一标识ID */ private Long id; /** * 用户显示昵称 */ private String nickname; } /** * 用户数据访问接口 */ @RepositoryRestResource(path = "users") public interface UserRepository extends JpaRepository<User, Long> { /** * 根据昵称模糊查询匹配的用户列表 * @param nickname 昵称关键词 * @return 符合条件的用户集合 */ List<User> findByNicknameContaining(String nickname); }只有这样,REST Docs才能提取到字段和方法的描述信息,填充到
auto-response-fields.adoc等文件中。配置Spring REST Docs的专属扩展
默认的自动生成逻辑可能没有开启完整的字段和参数解析,你需要在测试类中使用Spring REST Docs为Spring Data REST提供的专属扩展RepositoryRestDocumentation,并明确指定要生成的文档内容。示例代码如下:@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureRestDocs(outputDir = "target/generated-snippets") @AutoConfigureMockMvc public class UserApiDocsTest { @Autowired private MockMvc mockMvc; @Test public void generateUserListDocs() throws Exception { this.mockMvc.perform(get("/users") .accept(MediaTypes.HAL_JSON)) .andExpect(status().isOk()) .andDo(document("users", repositoryRestResourceDocumentation( resourceDetails(), responseFields( fieldWithPath("id").description("用户唯一标识ID"), fieldWithPath("nickname").description("用户显示昵称"), fieldWithPath("_links").description("相关资源跳转链接") ) ) )); } }这个专属扩展能精准解析Spring Data REST自动生成的API结构,避免出现空文档片段的问题。
排查字段暴露的自定义配置
如果你通过RepositoryRestConfigurer配置了实体字段的暴露限制,或者用@JsonIgnore等注解隐藏了字段,REST Docs的自动生成逻辑也会看不到这些字段,导致片段为空。比如:@Configuration public class RestConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // 仅暴露指定字段的情况下,未配置的字段不会出现在文档中 config.exposeIdsFor(User.class); } }这种情况下,要确保你想在文档中展示的字段都被正确暴露了。
内容的提问来源于stack exchange,提问作者Thomas B.

