springboot学习第8期 - springdoc

SpringDoc 是专为 Spring Boot 设计的「现代化 API 文档自动生成器」,基于 OpenAPI 3 规范,可 0 配置生成 Swagger-UI、JSON、YAML 接口文档,用来替代早已停止维护的 SpringFox(Swagger2)

导入依赖

xml 复制代码
<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
  <version>2.8.9</version>
</dependency>

接口文档展示

然后访问 http://localhost:8080/swagger-ui/index.html 即可展示接口文档:

示json格式:http://localhost:8080/v3/api-docs

下载yaml格式:http://localhost:8080/v3/api-docs.yaml

如果自定义了 ApiResponse 并且使用 ResponseBodyAdvice 进行转换,则需要 ResponseBodyAdvice 放过 SpringDoc 接口 ↓

java 复制代码
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    // 不拦截 springdoc 请求
    return !returnType.getDeclaringClass().getPackageName()
    .startsWith("org.springdoc");
}

配置接口文档元信息

java 复制代码
@Configuration
public class SpringDocConfig {

    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("用户中心 API")
                        .version("1.0.0")
                        .description("基于 Spring Boot 3 的用户中心")
                        .contact(new Contact().name("技术支持").email("dev@xxx.com"))
                        .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0")))
                .externalDocs(new ExternalDocumentation()
                        .description("项目 Wiki")
                        .url("https://wiki.xxx.com"));
    }
}

接口调试

可以直接在 swagger ui 界面调试接口:

配合spring security

如果是基于spring security,还需要额外的配置。

首先需要放行 swagger 相关的接口:

java 复制代码
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
    .csrf(AbstractHttpConfigurer::disable)
    .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
    .formLogin(AbstractHttpConfigurer::disable)
    .httpBasic(AbstractHttpConfigurer::disable)
    .authorizeHttpRequests(authorize -> authorize
       .requestMatchers("/api/auth/**").permitAll()
       .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-ui.html").permitAll()   // 新增
       .anyRequest().authenticated()
      )
    .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
    .exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(new AuthenticationEntryPointImpl()))
    .cors(cors -> cors.configurationSource(corsConfigurationSource()))
    .build();
}

JwtFilter也需要放行这些接口:

java 复制代码
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
// 这些路径不走 JwtFilter
return pathMatcher.match("/api/auth/**", request.getServletPath()) ||
    pathMatcher.match("/swagger-ui/**", request.getServletPath()) ||    // 新增
    pathMatcher.match("/v3/api-docs/**", request.getServletPath()) ||   // 新增
    pathMatcher.match("/swagger-ui.html", request.getServletPath());    // 新增
}

由于增加了spring securty 和 Jwt 认证,那么需要认证的接口如果不传递token是无法访问资源的,那么如果在 swagger ui 输入 token 呢,可以增加以下配置:

java 复制代码
@Configuration
public class SpringDocConfig {

    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
        .info(new Info()
              .title("用户中心 API")
              .version("1.0.0")
              .description("基于 Spring Boot 3 的用户中心")
              .contact(new Contact().name("技术支持").email("dev@xxx.com"))
              .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0")))
        .externalDocs(new ExternalDocumentation()
                      .description("项目 Wiki")
                      .url("https://wiki.xxx.com"))
        // 增加以下配置 ↓↓↓↓
        .components(new Components()
                    .addSecuritySchemes("bearerAuth",
                                        new SecurityScheme()
                                        .type(SecurityScheme.Type.HTTP)
                                        .scheme("bearer")
                                        .bearerFormat("JWT")))
        // 默认全局生效
        .addSecurityItem(new SecurityRequirement().addList("bearerAuth"));
    }

}

这时候 swagger ui 会新增一个认证按钮,可以输入token:

然后就可以调用认证接口:

常用注解

@Tag - 接口分组

java 复制代码
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
@Tag(name = "User", description = "User API")   // 关键
public class UserController {

    private final UserRepository userRepository;

    @GetMapping
    public List<User> getUsers() {
        return userRepository.findAll();
    }

}

@Operation -- 接口描述

java 复制代码
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
@Tag(name = "User", description = "User API")
public class UserController {

    private final UserRepository userRepository;

    @GetMapping
    @Operation(summary = "查询所有用户", description = "查询所有用户 details")  // 关键
    public List<User> getUsers() {
        return userRepository.findAll();
    }

}
相关推荐
风流倜傥唐伯虎2 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
fuquxiaoguang2 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐3 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
顾北123 小时前
MCP服务端开发:图片搜索助力旅游计划
java·spring boot·dubbo
昀贝3 小时前
IDEA启动SpringBoot项目时报错:命令行过长
java·spring boot·intellij-idea
indexsunny5 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
Coder_Boy_5 小时前
基于SpringAI的在线考试系统-相关技术栈(分布式场景下事件机制)
java·spring boot·分布式·ddd
韩立学长8 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
摇滚侠8 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
打工的小王10 小时前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端