m0_58765004 2023-12-05 23:27 采纳率: 58.3%
浏览 23

Knife4j 生成接口文档时,swagger配置问题

使用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中类型的接口,如下

img

img


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

  • 写回答

3条回答 默认 最新

  • dabocaiqq 2023-12-06 00:45
    关注

    看看你的日志,是不是少了什么

    评论

报告相同问题?

问题事件

  • 创建了问题 12月5日