|
|
@@ -4,22 +4,17 @@ import cn.hfln.framework.knife4j.doc.base.BaseSwaggerConfig;
|
|
|
import cn.hfln.framework.knife4j.doc.base.SwaggerProperties;
|
|
|
import cn.hfln.framework.knife4j.doc.properties.DocProperties;
|
|
|
import io.swagger.v3.oas.models.OpenAPI;
|
|
|
-import io.swagger.v3.oas.models.info.Contact;
|
|
|
-import io.swagger.v3.oas.models.info.Info;
|
|
|
-import io.swagger.v3.oas.models.info.License;
|
|
|
-import io.swagger.v3.oas.models.Components;
|
|
|
-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.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springdoc.core.SpringDocConfiguration;
|
|
|
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 org.springframework.context.annotation.Configuration;
|
|
|
import org.springframework.context.annotation.Import;
|
|
|
import org.springframework.context.annotation.Primary;
|
|
|
|
|
|
+import java.util.List;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -27,61 +22,61 @@ import java.util.stream.Collectors;
|
|
|
* knife4j 接口文档配置
|
|
|
*/
|
|
|
@Configuration
|
|
|
-@EnableConfigurationProperties(DocProperties.class)
|
|
|
@ConditionalOnProperty(value = "lnxx.knife4j.doc.enable", havingValue = "true", matchIfMissing = true)
|
|
|
@Import(SpringDocConfiguration.class)
|
|
|
public class DocAutoConfigure extends BaseSwaggerConfig {
|
|
|
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(DocAutoConfigure.class);
|
|
|
+
|
|
|
private final DocProperties properties;
|
|
|
|
|
|
public DocAutoConfigure(DocProperties properties) {
|
|
|
this.properties = properties;
|
|
|
+ log.info("=== Knife4j DocAutoConfigure 初始化 ===");
|
|
|
+ log.info("DocProperties: {}", properties);
|
|
|
+ if (properties.getServers() != null && !properties.getServers().isEmpty()) {
|
|
|
+ log.info("配置的 servers 字段:");
|
|
|
+ for (int i = 0; i < properties.getServers().size(); i++) {
|
|
|
+ DocProperties.ServerConfig server = properties.getServers().get(i);
|
|
|
+ log.info(" [{}] url: {}, description: {}", i, server.getUrl(), server.getDescription());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.warn("未配置 servers 字段,serverUrl: {}", properties.getServerUrl());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Bean
|
|
|
@Primary
|
|
|
@ConditionalOnMissingBean
|
|
|
+ @ConditionalOnProperty(value = "lnxx.knife4j.doc.gateway.enable", havingValue = "false", matchIfMissing = true)
|
|
|
public OpenAPI customOpenAPI() {
|
|
|
- OpenAPI openAPI = new OpenAPI()
|
|
|
- .info(new Info()
|
|
|
- .title(properties.getTitle())
|
|
|
- .description(String.format("<div style='font-size:%spx;color:%s;'>%s</div>",
|
|
|
- properties.getDescriptionFontSize(), properties.getDescriptionColor(), properties.getDescription()))
|
|
|
- .version(properties.getVersion())
|
|
|
- .contact(new Contact()
|
|
|
- .name(properties.getName())
|
|
|
- .url(properties.getUrl())
|
|
|
- .email(properties.getEmail()))
|
|
|
- .license(new License()
|
|
|
- .name(properties.getLicense())
|
|
|
- .url(properties.getLicenseUrl()))
|
|
|
- .termsOfService(properties.getTermsOfServiceUrl()));
|
|
|
-
|
|
|
- // 只使用 yml 配置的 servers 字段,不设置默认 server
|
|
|
- if (properties.getServers() != null && !properties.getServers().isEmpty()) {
|
|
|
- openAPI.setServers(properties.getServers().stream()
|
|
|
- .map(cfg -> new Server().url(cfg.getUrl()).description(cfg.getDescription()))
|
|
|
- .collect(Collectors.toList()));
|
|
|
+ log.info("=== 开始创建 OpenAPI 实例 ===");
|
|
|
+ SwaggerProperties swaggerProps = swaggerProperties();
|
|
|
+ log.info("SwaggerProperties servers: {}", swaggerProps.getServers());
|
|
|
+ log.info("SwaggerProperties serverUrl: {}", swaggerProps.getServerUrl());
|
|
|
+
|
|
|
+ OpenAPI openAPI = createOpenAPI(swaggerProps);
|
|
|
+
|
|
|
+ if (openAPI.getServers() != null && !openAPI.getServers().isEmpty()) {
|
|
|
+ log.info("=== OpenAPI servers 字段设置成功 ===");
|
|
|
+ for (int i = 0; i < openAPI.getServers().size(); i++) {
|
|
|
+ log.info(" [{}] server url: {}, description: {}",
|
|
|
+ i,
|
|
|
+ openAPI.getServers().get(i).getUrl(),
|
|
|
+ openAPI.getServers().get(i).getDescription());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.error("=== OpenAPI servers 字段为空!这将导致 UI 请求不带前缀 ===");
|
|
|
}
|
|
|
-
|
|
|
- if (properties.isEnableSecurity()) {
|
|
|
- openAPI.addSecurityItem(new SecurityRequirement().addList("Bearer"))
|
|
|
- .components(new Components()
|
|
|
- .addSecuritySchemes("Bearer",
|
|
|
- new SecurityScheme()
|
|
|
- .type(SecurityScheme.Type.HTTP)
|
|
|
- .scheme("bearer")
|
|
|
- .bearerFormat("JWT")
|
|
|
- .in(SecurityScheme.In.HEADER)
|
|
|
- .name("Authorization")));
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
return openAPI;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public SwaggerProperties swaggerProperties() {
|
|
|
- return SwaggerProperties.builder()
|
|
|
+ log.info("=== 构建 SwaggerProperties ===");
|
|
|
+
|
|
|
+ SwaggerProperties.SwaggerPropertiesBuilder builder = SwaggerProperties.builder()
|
|
|
.apiBasePackage(properties.getBasePackage())
|
|
|
.title(properties.getTitle())
|
|
|
.description(String.format("<div style='font-size:%spx;color:%s;'>%s</div>",
|
|
|
@@ -92,7 +87,32 @@ public class DocAutoConfigure extends BaseSwaggerConfig {
|
|
|
.contactEmail(properties.getEmail())
|
|
|
.enableSecurity(properties.isEnableSecurity())
|
|
|
.group("default")
|
|
|
- .serverUrl(properties.getServerUrl())
|
|
|
- .build();
|
|
|
+ .serverUrl(properties.getServerUrl());
|
|
|
+
|
|
|
+ // 转换 servers 字段
|
|
|
+ if (properties.getServers() != null && !properties.getServers().isEmpty()) {
|
|
|
+ log.info("正在转换 DocProperties.ServerConfig -> SwaggerProperties.ServerConfig");
|
|
|
+ List<SwaggerProperties.ServerConfig> convertedServers = properties.getServers().stream()
|
|
|
+ .map(s -> {
|
|
|
+ SwaggerProperties.ServerConfig sc = new SwaggerProperties.ServerConfig();
|
|
|
+ sc.setUrl(s.getUrl());
|
|
|
+ sc.setDescription(s.getDescription());
|
|
|
+ log.info(" 转换: {} -> {}", s.getUrl(), sc.getUrl());
|
|
|
+ return sc;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ builder.servers(convertedServers);
|
|
|
+ log.info("servers 字段转换完成,共 {} 个", convertedServers.size());
|
|
|
+ } else {
|
|
|
+ log.warn("properties.getServers() 为空或 null");
|
|
|
+ builder.servers(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ SwaggerProperties result = builder.build();
|
|
|
+ log.info("=== SwaggerProperties 构建完成 ===");
|
|
|
+ log.info("最终 SwaggerProperties.servers: {}",
|
|
|
+ result.getServers() != null ? result.getServers().size() + " 个" : "null");
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
}
|