目录
1.错误描述
knife4j增强功能,使用@ApiOperationSupport(author = "Benjamin", order = 1)并且使用@EnableKnife4j注解指定作者和排序不起作用,页面不显示,启动项目也可以启动,但是通过配置文件配置knife4j.enable=true报下面错。问题大概的意思就是版本冲突
2023-08-19 14:03:44.088 ERROR 22564 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
com.github.xiaoymin.knife4j.spring.plugin.OperationDynamicResponseModelProvider.apply(OperationDynamicResponseModelProvider.java:47)
The following method did not exist:
springfox.documentation.spi.service.contexts.RequestMappingContext.findAnnotation(Ljava/lang/Class;)Ljava/util/Optional;
The method's class, springfox.documentation.spi.service.contexts.RequestMappingContext, is available from the following locations:
jar:file:/Z:/maven/repository/io/springfox/springfox-spi/2.9.2/springfox-spi-2.9.2.jar!/springfox/documentation/spi/service/contexts/RequestMappingContext.class
The class hierarchy was loaded from the following locations:
springfox.documentation.spi.service.contexts.RequestMappingContext: file:/Z:/maven/repository/io/springfox/springfox-spi/2.9.2/springfox-spi-2.9.2.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of springfox.documentation.spi.service.contexts.RequestMappingContext
Process finished with exit code 1
2.原因
knife4j-spring-boot-starter内部jar包版本冲突,以我用的2.0.9版本为例。可以通过IDEA查看依赖快捷键ctrl+alt+shift+u(show dependencied),可以直接输入jar包名字进行搜索定位jar包来源。
最后追踪到springfox-spi 2.9.2有一个版本是来自springfox-swagger2包里面。
3.解决
需要排序springfox-swagger2包,重新引入,引版本2.10.10及以上既可以解决。
<!--knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<!--<version>3.0.2</version>-->
<version>2.0.9</version>
<exclusions>
<exclusion>
<artifactId>springfox-swagger2</artifactId>
<groupId>io.springfox</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<artifactId>springfox-swagger2</artifactId>
<groupId>io.springfox</groupId>
<version>2.10.0</version>
</dependency>
springfox-swagger2版本2.9.2及一下swagger注解用@EnableSwagger2注解,springfox-swagger2版本2.10.0及以上swagger注解用@EnableSwagger2WebMvc注解;
knife4j版本在2.0.7以下可以用@EnableKnife4j开启增强功能,但是在2.0.7以后需要在配置文件里面设置knife4j.enable: true使用后面新增的增强功能。比如设置作者以及接口排序功能。
页面如下:
如果在页面上面看不到作者可以在doc.html页面请求一下,查看一下接口返回的信息。
4.swagger配置
import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
/**
* @author Benjamin
* @version 1.0.0
* @date 2023/08/14 21:08:31
*/
@Configuration
// springfox-swagger2 2.9.2及以下版本用这个注解
//@EnableSwagger2
//@EnableKnife4j 只能有knife4j.enable=true开启增强功能,这个注解2.0.7之前用
// springfox-swagger2 2.10.0及以上版本用这个注解
@EnableSwagger2WebMvc
public class SwaggerConfig {
private final OpenApiExtensionResolver openApiExtensionResolver;
@Autowired
public SwaggerConfig(OpenApiExtensionResolver openApiExtensionResolver) {
this.openApiExtensionResolver = openApiExtensionResolver;
}
@Bean
public Docket createRestApi() {
//OpenApiExtendSetting openApiExtendSetting = new OpenApiExtendSetting();
//List<MarkdownProperty> list =new ArrayList<>();
return new Docket(DocumentationType.SWAGGER_2)
.groupName("user")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.leyou.user.controller"))
.paths(PathSelectors.any())
.build()
//.extensions(new OpenApiExtensionResolver(openApiExtendSetting, list).buildExtensions("user"));
.extensions(openApiExtensionResolver.buildExtensions("user"));
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("用户")
.description("用户模块")
.version("1.0.0")
.contact(new Contact("Benjamin","https://mp.csdn.net/mp_blog/creation/editor/131132418", ""))
.license("Benjamin")
.licenseUrl("")
.build();
}
}