SpringCloud base-frame通用swagger搭建

背景

今天突然想给项目加丝袜哥,常规的集成百度一大片。于是乎就想写一个通用性很强的swagger,只需要在base-frame中写,一般每个公司的微服务引用都会引用公司自己的base-frame依赖。于是说干就干

实现

引入pom依赖

<!--swagger-->
<dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>2.9.2</version>
 </dependency>
 <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.9.2</version>
 </dependency>

 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.16.22</version>
 </dependency>
注意,注意,注意

项目搭建的时候使用的spring-boot-starter-parent的版本为2.6及以上的,目前新建项目的时候从官网拉模板,拉下来版本就是2.6以上,项目启动的时候会报org.springframework.context.ApplicationContextException: Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException这个错误,需要降低spring-boot-starter-parent的版本,我使用的是2.5.6

配置文件配置

server:
  port: 8081
swagger:
  title: demo_project
  description: project description
  version: 1.0
  contactEmail: 123456@qq.com

swagger配置文件实体

@Data
@Component
public class SwaggerVO {

    @Value("${swagger.title}")
    private String title;

    @Value("${swagger.description}")
    private String description;

    @Value("${swagger.version}")
    private String version;

    @Value("${swagger.contactEmail}")
    private String contactEmail;

    @Value("${server.port}")
    private String port;

}

自定义注解实现swagger,这样只需要在项目启动类上加上对应的注解就可以启用swagger。如果是手动打包那直接去掉注解就OK。但是如果是走CICD打包,我目前没有更好的解决方案,如果有方案的铁子看到欢迎留言,技术共勉!

自定义swagger启动注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({SwaggerConfig.class})
public @interface EnableSwagger {
}

注解实现类SwaggerConfig

@EnableSwagger2
public class SwaggerConfig {

    @Autowired
    private SwaggerVO vo;

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //是否开启 (true 开启  false隐藏。生产环境建议隐藏)
                .enable(true)
                .select()
                //此处是扫描存在@Api注解的类,然后注入
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                //指定路径处理PathSelectors.any()代表所有的路径
                .paths(PathSelectors.any())
                    .build().globalOperationParameters(addParameter());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //设置文档标题(API名称)
                .title(vo.getTitle())
                //文档描述
                .description(vo.getDescription())
                //服务条款URL
                .termsOfServiceUrl("http://localhost:"+vo.getPort() == null ? "8080" : vo.getPort() )
                //版本号
                .version(vo.getVersion())
                .build();
    }

    private List<Parameter> addParameter(){
        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<>();
        tokenPar.name("token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).defaultValue("xxxx").build();
        pars.add(tokenPar.build());
        return pars;
    }

}

RequestHandlerSelectors.withClassAnnotation(Api.class)此处注意。一般大家使用的是扫描controller包,此处是配置的扫描带@Api注解的控制器。

我在配置中加了默认请求头中带开发token。项目在开发阶段可以写死一个开发token在redis中,否则实际请求的时候需要去找token。

以上就是通用swagger搭建过程。如有问题,希望大家评论区留言多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值