使用Knife4j 生成接口文档时,swagger配置如下
package com.plan.common.swagger.config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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 springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
import javax.annotation.Resource;
//@Configuration
@EnableSwagger2WebMvc
@EnableKnife4j
@EnableConfigurationProperties(SwaggerProperties.class)
@ConditionalOnProperty(name = "swagger.enabled",matchIfMissing = true)
@Slf4j
public class SwaggerAutoConfiguration {
/**
* 默认的排除路径,排除Spring Boot默认的错误处理路径和端点
*
*/
/*引入Knife4j提供的扩展类*/
private final OpenApiExtensionResolver openApiExtensionResolver;
public SwaggerAutoConfiguration(OpenApiExtensionResolver openApiExtensionResolver) {
this.openApiExtensionResolver = openApiExtensionResolver;
}
private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**");
private static final String BASE_PATH = "/**";
@Bean
public Docket api(SwaggerProperties swaggerProperties)
{
log.info("swagger初始化开始");
// base-path处理
if (swaggerProperties.getBasePath().isEmpty())
{
swaggerProperties.getBasePath().add(BASE_PATH);
}
// noinspection unchecked
List<Predicate<String>> basePath = new ArrayList<Predicate<String>>();
swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path)));
// exclude-path处理
if (swaggerProperties.getExcludePath().isEmpty())
{
swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH);
}
List<Predicate<String>> excludePath = new ArrayList<>();
swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path)));
ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2)
.host(swaggerProperties.getHost())
.apiInfo(apiInfo(swaggerProperties))
.select()
.apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
;
swaggerProperties.getBasePath().forEach(p -> builder.paths(PathSelectors.ant(p)));
swaggerProperties.getExcludePath().forEach(p -> builder.paths(PathSelectors.ant(p).negate()));
//builder.build().extensions(openApiExtensionResolver.buildExtensions(""));
log.info("swagger初始化结束");
return builder.build().extensions(openApiExtensionResolver.buildExtensions("")).securityContexts(securityContexts())
.pathMapping("/");
// .securitySchemes(securitySchemes())
// .securityContexts(
// securityContexts()
// ).pathMapping("/");
}
/**
* 安全模式,这里指定token通过Authorization头请求头传递
*/
private List<SecurityScheme> securitySchemes()
{
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeyList;
}
/**
* 安全上下文
*/
private List<SecurityContext> securityContexts()
{
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
// .securityReferences(defaultAuth())
// .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build());
return securityContexts;
}
/**
* 默认的全局鉴权策略
*
* @return
*/
private List<SecurityReference> defaultAuth()
{
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
private ApiInfo apiInfo(SwaggerProperties swaggerProperties)
{
return new ApiInfoBuilder()
.title(swaggerProperties.getTitle())
.description(swaggerProperties.getDescription())
.license(swaggerProperties.getLicense())
.licenseUrl(swaggerProperties.getLicenseUrl())
.termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl())
//.contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail()))
.version(swaggerProperties.getVersion())
.build();
}
}
/**
* @Bean
* public Docket docket(){
* return new Docket(DocumentationType.SWAGGER_2)
* .apiInfo(apiInfo())
* .select()
* //RequestHandlerSelectors,配置要扫描接口的方式
* //basePackage:指定要扫描的包
* //any():扫描全部
* //none():不扫描
* //withClassAnnotation():扫描类上的注解,参数是一个注解的反射对象
* //withMethodAnnotation():扫描方法上的注解
* .apis(RequestHandlerSelectors.basePackage("com.example.swagger.controller"))//指定某个包去扫描
* //paths():过滤什么路径
* .paths(PathSelectors.ant("/example/**"))
* .build();//build
* }
*/
controller层代码
package com.plan.system.controller;
import com.plan.common.core.constant.CacheNames;
import com.plan.common.core.constant.Constants;
import com.plan.common.core.domain.R;
import com.plan.common.redis.utils.CacheUtils;
import com.plan.common.redis.utils.RedisUtils;
import com.plan.system.entity.SysUser;
import com.plan.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* @author wzy
* @create 2023/11/5 19:54
* @description
*/
@RestController
@RequestMapping("test")
@RequiredArgsConstructor
@Api(tags = "测试管理",value = "测试controller")
public class TestController {
private final ISysUserService sysUserServiceImpl;
@Value("${spring.datasource.url}")
private String value;
@RequestMapping("t1")
@ApiOperation("T1")
public R<List<String>> select(){
// SysUser sysUser = new SysUser();
// sysUser.setPassword("099999999999999");
// sysUser.setStatus(0);
// sysUser.setUserName("6666");
// sysUserServiceImpl.save(sysUser);
List<String> strings = new ArrayList<>();
strings.add("ppppppp");
System.out.println("测试色hi谁谁黑:"+value);
return R.ok(strings);
}
@RequestMapping("t2")
@ApiOperation("T2")
public R<SysUser> select2(){
SysUser user = sysUserServiceImpl.selectUserName("6666");
return R.ok(user);
}
@RequestMapping("t3")
public R<SysUser> select3(){
SysUser user = RedisUtils.getCacheObject("6666");
System.out.println("redis缓存中的user="+user);
SysUser user1 = null;
try {
user1 = CacheUtils.get(CacheNames.SYS_USER,"6666");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Cache缓存中的user="+user1);
return R.ok(user);
}
}
访问doc.html-一个方法生成了7中类型的接口,如下


有没有遇到这种情况?求解答