package com.ard.common.swagger.config; import java.util.ArrayList; import java.util.List; import io.swagger.v3.oas.models.Operation; import org.springdoc.core.configuration.SpringDocConfiguration; import org.springdoc.core.customizers.OperationCustomizer; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import com.ard.common.swagger.config.properties.SpringDocProperties; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; import org.springframework.web.method.HandlerMethod; /** * Swagger 文档配置 * * @author ard */ @AutoConfiguration(before = SpringDocConfiguration.class) @EnableConfigurationProperties(SpringDocProperties.class) @ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true) public class SpringDocAutoConfiguration { @Bean @ConditionalOnMissingBean(OpenAPI.class) public OpenAPI openApi(SpringDocProperties properties) { return new OpenAPI().components(new Components() // 设置认证的请求头 .addSecuritySchemes("apikey", securityScheme())) .addSecurityItem(new SecurityRequirement().addList("apikey")) .info(convertInfo(properties.getInfo())) .servers(servers(properties.getGatewayUrl())); } public SecurityScheme securityScheme() { return new SecurityScheme().type(SecurityScheme.Type.APIKEY) .name("Authorization") .in(SecurityScheme.In.HEADER) .scheme("Bearer"); } private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) { Info info = new Info(); info.setTitle(infoProperties.getTitle()); info.setDescription(infoProperties.getDescription()); info.setContact(infoProperties.getContact()); info.setLicense(infoProperties.getLicense()); info.setVersion(infoProperties.getVersion()); return info; } public List servers(String gatewayUrl) { List serverList = new ArrayList<>(); serverList.add(new Server().url(gatewayUrl)); return serverList; } /** * 过滤器:只保留方法上标注了 @Operation 注解的接口 */ @Bean public OperationCustomizer customOperationCustomizer() { return (Operation operation, HandlerMethod handlerMethod) -> { // 使用全限定名来检查注解 if (handlerMethod.hasMethodAnnotation(io.swagger.v3.oas.annotations.Operation.class)) { return operation; // 这里的 operation 是 models.Operation 类型 } return null; }; } }