分享我的knife4j报错了!/v3/api-docs接口500
lihuibear你是小麻瓜,这天你写了个Springboot3的项目 并且使用了 3.4及以上的版本,你又想配置一下knife4j,看着官方教程 一顿操作,诶!网页打开了,突然提示Knife4j文档请求异常!
这你麻了,这可如何是好!降版本?不行 ,我现在的项目需要这个版本!完了完了!
解决方法来了~
依赖
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.5.0</version> <exclusions> <exclusion> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.8.8</version> </dependency>
|
配置
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.core.conf.ExtensionsConstants; import com.github.xiaoymin.knife4j.core.conf.GlobalConstants; import com.github.xiaoymin.knife4j.spring.configuration.Knife4jHttpBasic; import com.github.xiaoymin.knife4j.spring.configuration.Knife4jProperties; import com.github.xiaoymin.knife4j.spring.configuration.Knife4jSetting; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.models.OpenAPI; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.springdoc.core.customizers.GlobalOpenApiCustomizer; import org.springdoc.core.properties.SpringDocConfigProperties; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.Configuration; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RestController;
import java.lang.annotation.Annotation; import java.util.*; import java.util.stream.Collectors;
@Slf4j @Configuration @EnableConfigurationProperties({Knife4jProperties.class, Knife4jSetting.class, Knife4jHttpBasic.class}) @ConditionalOnProperty(name = "knife4j.enable", havingValue = "true") public class Knife4jOpenApiCustomizer extends com.github.xiaoymin.knife4j.spring.extension.Knife4jOpenApiCustomizer implements GlobalOpenApiCustomizer { final Knife4jProperties knife4jProperties; final SpringDocConfigProperties properties;
public Knife4jOpenApiCustomizer(Knife4jProperties knife4jProperties, SpringDocConfigProperties properties) { super(knife4jProperties, properties); this.knife4jProperties = knife4jProperties; this.properties = properties; }
@Override public void customise(OpenAPI openApi) { log.debug("OpenApiCustomizermizer"); if (knife4jProperties.isEnable()) { Knife4jSetting setting = knife4jProperties.getSetting(); OpenApiExtensionResolver openApiExtensionResolver = new OpenApiExtensionResolver(setting, knife4jProperties.getDocuments()); openApiExtensionResolver.start(); Map<String, Object> objectMap = new HashMap<>(); objectMap.put(GlobalConstants.EXTENSION_OPEN_SETTING_NAME, setting); objectMap.put(GlobalConstants.EXTENSION_OPEN_MARKDOWN_NAME, openApiExtensionResolver.getMarkdownFiles()); openApi.addExtension(GlobalConstants.EXTENSION_OPEN_API_NAME, objectMap); addOrderExtension(openApi); } }
private void addOrderExtension(OpenAPI openApi) { if (CollectionUtils.isEmpty(properties.getGroupConfigs())) { return; } Set<String> packagesToScan = properties.getGroupConfigs().stream() .map(SpringDocConfigProperties.GroupConfig::getPackagesToScan) .filter(toScan -> !CollectionUtils.isEmpty(toScan)) .flatMap(List::stream) .collect(Collectors.toSet()); if (CollectionUtils.isEmpty(packagesToScan)) { return; } Set<Class<?>> classes = packagesToScan.stream() .map(packageToScan -> scanPackageByAnnotation(packageToScan, RestController.class)) .flatMap(Set::stream) .filter(clazz -> clazz.isAnnotationPresent(ApiSupport.class)) .collect(Collectors.toSet()); if (!CollectionUtils.isEmpty(classes)) { Map<String, Integer> tagOrderMap = new HashMap<>(); classes.forEach( clazz -> { Tag tag = getTag(clazz); if (Objects.nonNull(tag)) { ApiSupport apiSupport = clazz.getAnnotation(ApiSupport.class); tagOrderMap.putIfAbsent(tag.name(), apiSupport.order()); } }); if (openApi.getTags() != null) { openApi .getTags() .forEach( tag -> { if (tagOrderMap.containsKey(tag.getName())) { tag.addExtension( ExtensionsConstants.EXTENSION_ORDER, tagOrderMap.get(tag.getName())); } }); } } } private Tag getTag(Class<?> clazz) { Tag tag = clazz.getAnnotation(Tag.class); if (Objects.isNull(tag)) { Class<?>[] interfaces = clazz.getInterfaces(); if (ArrayUtils.isNotEmpty(interfaces)) { for (Class<?> interfaceClazz : interfaces) { Tag anno = interfaceClazz.getAnnotation(Tag.class); if (Objects.nonNull(anno)) { tag = anno; break; } } } } return tag; } private Set<Class<?>> scanPackageByAnnotation( String packageName, final Class<? extends Annotation> annotationClass) { ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass)); Set<Class<?>> classes = new HashSet<>(); for (BeanDefinition beanDefinition : scanner.findCandidateComponents(packageName)) { try { Class<?> clazz = Class.forName(beanDefinition.getBeanClassName()); classes.add(clazz); } catch (ClassNotFoundException ignore) { } } return classes; } }
|
刷新maven!重启项目!成了!
