编写自己的starter项目(battcn-starter-swagger)

Posted 受伤滴小萝卜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写自己的starter项目(battcn-starter-swagger)相关的知识,希望对你有一定的参考价值。

自定义 starter 项目,方便其他地方调用,类似 spring.datasource.url 这种,本次以自己封装的 battcn-starter-swagger 为案例

创建一个Maven工程 battcn-starter-swagger

- pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.battcn</groupId>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>
    <artifactId>battcn-starter-swagger</artifactId>
    <name>battcn-starter-swagger</name>
    <url>http://blog.battcn.com</url>
    <description>基于SpringBoot1.5.4包装的Swagger只要依赖该JAR包即可做到自动装配</description>
    <version>1.0.1</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <springfox.version>2.6.1</springfox.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${springfox.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${springfox.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!--配置maven阿里云仓库开始,不用去改maven的setting -->
    <repositories>
        <repository>
            <id>public</id>
            <name>local private nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>local private nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    <!--配置maven阿里云结束 -->
</project>

- SwaggerAutoConfiguration

定义我们的 SwaggerAutoConfiguration 自动装配类

package com.battcn.framework.swagger;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
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.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMethod;
import com.battcn.framework.swagger.properties.ApiInfoProperties;
import com.battcn.framework.swagger.properties.DocketProperties;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * 自动装配类
 * @author Levin
 * @Q群:391619659
 */
@Configuration
@EnableConfigurationProperties(value = { SwaggerProperties.class })
@ConditionalOnProperty(name = "swagger.enable")
@EnableSwagger2
public class SwaggerAutoConfiguration {

    @Autowired
    SwaggerProperties properties;

    @Bean
    public Docket petApi() {
        DocketProperties docket = properties.getDocket();
        List<ResponseMessage> messages = new ArrayList<>();
        ResponseMessage message1 = new ResponseMessageBuilder().code(200).message("操作成功")
                .responseModel(new ModelRef("操作成功")).build();
        ResponseMessage message2 = new ResponseMessageBuilder().code(400).message("非法请求")
                .responseModel(new ModelRef("非法请求")).build();
        ResponseMessage message3 = new ResponseMessageBuilder().code(501).message("如请求路径拼写不正确")
                .responseModel(new ModelRef("如请求路径拼写不正确")).build();
        ResponseMessage message4 = new ResponseMessageBuilder().code(502).message("服务器过载引起的错误")
                .responseModel(new ModelRef("服务器过载引起的错误")).build();
        messages.add(message1);
        messages.add(message2);
        messages.add(message3);
        messages.add(message4);
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName(docket.getGroupName()).select()
                .apis(RequestHandlerSelectors.basePackage(docket.getBasePackage())).paths(PathSelectors.any()).build()
                .pathMapping("/").directModelSubstitute(LocalDate.class, String.class)
                .genericModelSubstitutes(ResponseEntity.class).useDefaultResponseMessages(false)
                .globalResponseMessage(RequestMethod.POST, messages);
    }

    private ApiInfo apiInfo() {
        ApiInfoProperties apiInfo = properties.getApiInfo();
        com.battcn.framework.swagger.properties.Contact contact = apiInfo.getContact();
        return new ApiInfoBuilder().title(apiInfo.getTitle()).description(apiInfo.getDescription())
                .termsOfServiceUrl(apiInfo.getTermsOfServiceUrl())
                .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail()))
                .version(apiInfo.getVersion()).license(apiInfo.getLicense()).licenseUrl(apiInfo.getLicenseUrl())
                .build();
    }
}

- SwaggerProperties

这一步就是定义我们的 Properties 对象,目的就是可以被IDEA正确识别,然后可以依赖注入

package com.battcn.framework.swagger;

import org.springframework.boot.context.properties.ConfigurationProperties;

import com.battcn.framework.swagger.properties.ApiInfoProperties;
import com.battcn.framework.swagger.properties.DocketProperties;

@ConfigurationProperties(prefix = "swagger")
public class SwaggerProperties implements java.io.Serializable {

    private static final long serialVersionUID = 8471755917762607584L;
    private Boolean enable;
    private ApiInfoProperties apiInfo;
    private DocketProperties docket;

    public ApiInfoProperties getApiInfo() {
        return apiInfo;
    }

    public void setApiInfo(ApiInfoProperties apiInfo) {
        this.apiInfo = apiInfo;
    }

    public DocketProperties getDocket() {
        return docket;
    }

    public void setDocket(DocketProperties docket) {
        this.docket = docket;
    }

    public Boolean getEnable() {
        return enable;
    }

    public void setEnable(Boolean enable) {
        this.enable = enable;
    }
}

- ApiInfoProperties

package com.battcn.framework.swagger.properties;

public class ApiInfoProperties implements java.io.Serializable {

    private static final long serialVersionUID = 8471755917762607584L;
    
    private String title;
    private String description;
    private String termsOfServiceUrl;
    private Contact contact;
    private String license;
    private String licenseUrl;
    private String version;
    
    // get set ...
}

- Contact

package com.battcn.framework.swagger.properties;

public class Contact {

    private String name;
    private String url;
    private String email;
    public Contact(){}
    
    public Contact(String name, String url, String email) {
        this.name = name;
        this.url = url;
        this.email = email;
    }
    // get set ...
}

- DocketProperties

package com.battcn.framework.swagger.properties;

public class DocketProperties implements java.io.Serializable {

    private static final long serialVersionUID = 3342663558680329645L;
    
    private String groupName;
    private String basePackage;

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public String getBasePackage() {
        return basePackage;
    }

    public void setBasePackage(String basePackage) {
        this.basePackage = basePackage;
    }
}

- ApiParamType

package com.battcn.framework.swagger.properties;

/**
 * 方便Swagger 中 @ApiImplicitParam(paramType = ApiParamType.HEADER)
 * @author Levin
 * @Q群:391619659
 */
public final class ApiParamType {
    
    public final static String QUERY = "query";
    public final static String HEADER = "header";
    public final static String PATH = "path";
    public final static String BODY = "body";
    public final static String FORM = "form";
    
}

- 注意

我们需要Spring容器初始化加载我们的 SwaggerAutoConfiguration 那么必须指定初始化类路径,在 src/main/resources
创建一个 META-INF 目录,然后定义一个 spring.factories

如下: = 号的左侧不需要改,右侧为我们 SwaggerAutoConfiguration 的路径

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.battcn.framework.swagger.SwaggerAutoConfiguration

至此我们自己的starter包就完成了,需要使用到的项目 pom.xml 中 加入我们的starter包

建议是用JDK1.8 SpringBoot1.5.4

<dependency>
    <groupId>com.battcn</groupId>
    <artifactId>battcn-starter-swagger</artifactId>
    <version>1.0.1</version>
</dependency>

- application.yml

#以下就是需要写的配置,注意base-package就可以了    
swagger:
  enable: true    #是否开启swagger/默认false
  api-info:
    description: battcn-plus
    license: battcn-plus
    license-url: http://www.battcn.com
    terms-of-service-url: http://www.battcn.com
    title: 鏖战八方
    version: 2.5.1
    contact:
      email: 1837307557@qq.com
      name: Levin
      url: http://www.battcn.com
  docket:
    base-package: com.battcn.platform.controller #扫描的路径/基本就是你的controller包下面
    group-name: battcn-manage

- 项目地址

PS:比如A项目使用了 battcn-starter-swagger 那么只需要输入 http://${host}:${port}/swagger-ui.html 即可

 

以上是关于编写自己的starter项目(battcn-starter-swagger)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 系列 - 自己写starter

开发一个属于自己的Spring Boot Starter

SpringBoot:手写一个 SpringBoot Starter

只需4步,自己搞个 Spring Boot Starter !

如何创建自己的 npm starter-kit?

SpringBoot自动配置原理及如何创建自己的Starter