// 定义包路径,用于存放Swagger配置类相关的代码。这个包名表明该类属于特定的项目模块(com.yf.exam)下的config部分, // 通常用于组织和管理与Swagger配置相关的代码。 package com.yf.exam.config; // 导入用于启用Swagger Bootstrap UI的注解,Swagger Bootstrap UI是对Swagger UI的一种增强, // 提供了更友好的界面展示和交互功能,通过该注解可以在项目中启用这一特性。 import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI; // 导入Swagger用于标注API操作的注解,通过在方法上添加该注解,可以为该方法在Swagger文档中生成详细的操作描述信息, // 包括方法的功能、参数、返回值等内容,方便开发者和使用者了解API的具体使用方式。 import io.swagger.annotations.ApiOperation; // 导入Spring框架中用于将类的属性与配置文件中的属性进行绑定的注解。 // 通过指定prefix属性,可以将配置文件中以该前缀开头的属性值绑定到类的对应属性上, // 在本类中用于绑定以"swagger"为前缀的配置属性。 import org.springframework.boot.context.properties.ConfigurationProperties; // 导入Spring框架中用于标记一个方法返回值为Spring Bean的注解。 // 被该注解标记的方法,其返回值会被Spring容器管理,作为一个可被注入到其他组件中的Bean实例。 // 在本类中用于将examApi、securityScheme等方法返回的对象注册为Spring Bean。 import org.springframework.context.annotation.Bean; // 导入Spring框架中用于标记一个类是配置类的注解。 // 被该注解标记的类可以在其中定义各种Bean配置方法,这些方法会被Spring容器在启动时自动识别并执行, // 用于创建和配置应用程序所需的各种组件。在本类中用于标记该类为Spring配置类,以便进行Swagger相关的配置。 import org.springframework.context.annotation.Configuration; // 导入Swagger用于构建API信息的构建器类,通过该构建器可以方便地设置API的标题、描述、联系人、版本等信息, // 在本类的apiInfo方法中用于创建并返回包含详细API信息的ApiInfo对象。 import springfox.documentation.builders.ApiInfoBuilder; // 导入Swagger用于选择路径的选择器类,通过该选择器可以指定哪些路径下的API需要被Swagger生成文档并展示, // 在本类的examApi方法中用于选择符合特定路径模式的API。 import springfox.documentation.builders.PathSelectors; // 导入Swagger用于选择请求处理器(即包含API方法的类或接口)的选择器类, // 通过该选择器可以指定哪些请求处理器中的方法需要被Swagger生成文档并展示, // 在本类的examApi方法中用于选择带有ApiOperation注解的方法所在的请求处理器。 import springfox.documentation.builders.RequestHandlerSelectors; // 导入Swagger用于表示API信息的类,该类包含了API的标题、描述、联系人、版本等详细信息, // 在本类的examApi方法中通过调用apiInfo方法获取该对象并设置到Docket中,以便在Swagger文档中展示这些信息。 import springfox.documentation.service.ApiInfo; // 导入Swagger用于表示API密钥的类,用于设置API的授权相关信息,如授权的键名、值的位置(如在请求头中)等, // 在本类的securityScheme方法中用于创建并返回一个ApiKey对象,用于设置API的授权方案。 import springfox.documentation.service.ApiKey; // 导入Swagger用于表示联系人信息的类,通过该类可以设置API的联系人姓名、联系方式、网址等信息, // 在本类的apiInfo方法中用于创建并返回一个包含联系人信息的Contact对象,并设置到ApiInfo中。 import springfox.documentation.service.Contact; // 导入Swagger用于表示安全方案的类,它是一个通用的接口,用于定义不同类型的安全方案, // 在本类的examApi方法中通过调用securityScheme方法获取具体的安全方案实现(如ApiKey)并设置到Docket中。 import springfox.documentation.service.SecurityScheme; // 导入Swagger用于表示文档类型的枚举类,目前主要有SWAGGER_2等类型, // 在本类的examApi方法中用于指定创建Docket对象时所采用的文档类型为SWAGagger_2。 import springfox.documentation.spi.DocumentationType; // 导入Swagger用于生成Swagger文档的核心类,通过该类可以配置各种Swagger相关的设置,如API信息、路径选择、 // 授权方案等,在本类的examApi方法中用于创建并配置Docket对象,以生成符合项目需求的Swagger文档。 import springfox.documentation.spring.web.plugins.Docket; // 导入用于启用Swagger 2的注解,通过在类上添加该注解,可以在项目中启用Swagger 2的功能, // 使得Swagger能够为项目中的API生成详细的文档并提供交互界面,方便开发者和使用者查看和测试API。 import springfox.documentation.swagger2.annotations.EnableSwagger2; // 导入Java标准库中的集合类,用于处理集合相关的操作,在本类的examApi方法中用于创建一个包含单个安全方案的列表, // 以便将安全方案设置到Docket对象中。 import java.util.Collections; /** * Swagger配置类,主要功能是配置Swagger在项目中的相关设置, * 包括启用Swagger 2和Swagger Bootstrap UI功能,绑定以"swagger"为前缀的配置属性, * 创建Docket对象并设置其API信息、分组名称、选择需要生成文档的API方法和路径、设置安全方案等, * 以生成详细的API文档并提供友好的交互界面,方便对项目中的API进行查看、测试和使用。 * @author bool * @date 2020/8/19 20:53 */ @Configuration // 使用该注解标记此为Spring配置类,表明这个类是用来进行Spring应用程序的配置工作的。 @EnableSwagger2 // 使用该注解启用Swagger 2功能,使得Swagger能够为项目中的API生成详细的文档并提供交互界面。 @EnableSwaggerBootstrapUI // 使用该注解启用Swagger Bootstrap UI功能,提供更友好的界面展示和交互功能。 @ConfigurationProperties(prefix = "swagger") // 使用该注解将类的属性与以"swagger"为前缀的配置文件中的属性进行绑定, // 以便在类中可以方便地使用这些配置属性来定制Swagger的设置。 public class SwaggerConfig { /** * 定义一个方法,并使用@Bean注解将其返回值声明为Spring Bean。 * 该方法用于创建并返回一个Docket对象,该对象是Swagger生成文档的核心组件, * 通过对其进行一系列设置,可以定制生成的API文档的内容和展示方式。 * * @return 返回一个Docket对象,该对象经过了相关设置,包括API信息、分组名称、选择的API方法和路径、安全方案等。 */ @Bean // 将该方法返回的Docket对象声明为Spring Bean,以便Spring容器能够管理和注入到其他需要使用的地方。 public Docket examApi() { return new Docket(DocumentationType.SWAGGER_2) // 创建一个新的Docket对象,并指定文档类型为SWAGGER_2, // 这是目前较为常用的Swagger文档类型,用于生成详细的API文档。 .apiInfo(apiInfo()) // 调用apiInfo方法获取包含详细API信息的ApiInfo对象,并设置到Docket对象中, // 以便在生成的Swagger文档中展示API的标题、描述、联系人、版本等信息。 .groupName("考试模块接口") // 设置Docket对象的分组名称为"考试模块接口", // 这样可以将项目中的API按照不同的模块或功能进行分组展示,方便查看和管理。 .select() // 开始选择需要生成文档的API,通过一系列选择器来指定具体的选择条件。 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 使用RequestHandlerSelectors的withMethodAnnotation方法选择带有ApiOperation注解的方法, // 即只选择那些在方法上标注了ApiOperation注解的API方法进行文档生成, // 这样可以确保只生成我们希望展示的重要API的文档。 .paths(PathSelectors.ant("/exam/api/**")) // 使用PathSelectors的ant方法选择符合特定路径模式的API, // 这里选择的路径模式是"/exam/api/**",表示只选择以"/exam/api/"开头的任意路径下的API进行文档生成, // 进一步限定了生成文档的API范围,使其更加聚焦于项目中的特定部分(如考试模块相关的API)。 .build() // 完成上述选择条件的设置后,调用build方法构建Docket对象,使其生效并包含我们所设置的所有选择条件和信息。 .securitySchemes(Collections.singletonList(securityScheme())) // 创建一个包含单个安全方案的列表, // 通过调用securityScheme方法获取具体的安全方案对象(如ApiKey), // 并将其添加到列表中,然后设置到Docket对象中, // 以便在Swagger文档中展示API的授权相关信息,如需要在请求头中传递的授权密钥等。 ; } /** * 用于创建并返回一个包含详细API信息的ApiInfo对象的方法。 * 通过ApiInfoBuilder类可以方便地设置API的标题、描述、联系人、版本等信息。 * * @return 返回一个ApiInfo对象,该对象包含了API的标题、描述、联系人、版本等详细信息, * 用于设置到Docket对象中,以便在Swagger文档中展示。 */ private ApiInfo apiInfo() { return new ApiInfoBuilder().title("考试系统接口") // 使用ApiInfoBuilder的title方法设置API的标题为"考试系统接口", // 这将在Swagger文档的顶部显著位置展示,让使用者快速了解该API所属的系统。 .description("考试系统接口") // 使用ApiInfoBuilder的description方法设置API的描述为"考试系统接口", // 可以在这里详细描述API的功能、用途、特点等信息,方便使用者进一步了解API的具体情况。 .contact(new Contact("Van", "https://exam.yfhl.net", "18365918@qq.com")) // 使用ApiInfoBuilder的contact方法创建一个包含联系人信息的Contact对象, // 并设置联系人姓名为"Van",网址为"https://exam.yfhl.net",邮箱为"18365918@qq.com", // 这些信息将在Swagger文档中展示,方便使用者在有问题时能够联系到相关人员。 .version("1.0.0") // 使用ApiInfoBuilder的version方法设置API的版本号为"1.0.0", // 让使用者了解该API的版本情况,以便在不同版本之间进行对比和选择。 .build(); // 完成上述各项信息的设置后,调用build方法构建ApiInfo对象,使其生效并包含我们所设置的所有信息。 } /** * 用于创建并返回一个表示API密钥的ApiKey对象的方法,该对象用于设置API的授权方案。 * * @return 返回一个ApiKey对象,该对象定义了API的授权相关信息,如授权的键名、值的位置(如在请求头中)等, * 用于设置到Docket对象中,以便在Swagger文档中展示API的授权要求。 */ @Bean // 将该方法返回的SecurityScheme对象(实际为ApiKey类型)声明为Spring Bean,以便Spring容器能够管理和注入到其他需要使用的地方。 SecurityScheme securityScheme() { return new ApiKey("token", "token", "header"); // 创建一个新的ApiKey对象, // 第一个参数"token"表示授权的键名,即客户端在请求时需要在指定位置(这里是请求头)传递的键名; // 第二个参数"token"表示授权的值,这里简单设置为与键名相同,实际应用中可能是根据用户登录等情况生成的授权令牌; // 第三个参数"header"表示授权的值应该放置的位置,这里指定为在请求头中传递。 } }