SpringBoot多模块开发中swagger识别不同模块中的controller包

SpringBoot多模块开发中swagger识别不同模块中的controller包

  1. 本文仅解决了在 Spring Boot 多模块中引入配置在common模块中的 controller 及在启动类管理下的 controller ,且未进行自动配置
  2. 本类是抽象类,需要在启动类下再写一个SwaggerConfig
  3. 注意修改 package

BaseSwaggerConfig

package ycl.springframework.boot.commons.config;

import cn.hutool.core.lang.Assert;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import ycl.springframework.boot.commons.constants.GlobalConstant;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * swagger配置
 *
 * @author YCL
 * @date 2021-06-06 15:00:00
 */
@Configuration
@EnableSwagger2
public abstract class BaseSwaggerConfig {

	private final String packageImport;//这是由继承的 SwaggerConfig 传进来的 controller 包
	private final String[] commonControllerPackages = {
			"ycl.springframework.boot.commons.base.controller",
	};//这是我的 common 下的 controller 包
	private final String title;
	private final String description = "swagger";
	private final String serviceUrl = "none";
	private final String version = "1.0";


	public BaseSwaggerConfig(String packageImport, String title) {
		Assert.notBlank(packageImport,
				"you will write your controller package to application.yml, key: project.controllerPackage");
		this.packageImport = packageImport;
		this.title = title;
	}

	@Bean
	public Docket createSwaggerApi() {
		return new Docket(DocumentationType.SWAGGER_2)
				.useDefaultResponseMessages(false)
				.apiInfo(apiInfo())
				.select()
				.apis(getPackages())
				.paths(PathSelectors.any())
				.build()
				.securitySchemes(securitySchemes())
				.securityContexts(securityContexts());
	}

	private Predicate<RequestHandler> getPackages() {
		int length = commonControllerPackages.length;
		String[] pkg = new String[commonControllerPackages.length + 1];
		System.arraycopy(commonControllerPackages, 0, pkg, 0, length);
		pkg[length] = packageImport;
		return v -> declaring(v).transform(handlerPackage(pkg)).or(true);
	}

	@SuppressWarnings("all")
	private Optional<? extends Class<?>> declaring(RequestHandler handler) {
		return Optional.fromNullable(handler.declaringClass());
	}

	@SuppressWarnings("all")
	private Function<Class<?>, Boolean> handlerPackage(String[] packages) {
		return v -> {
			for (String p : packages) {
				if (v.getPackage().getName().startsWith(p))
					return true;
			}
			return false;
		};
	}


	private List<SecurityContext> securityContexts() {
		ArrayList<SecurityContext> list = new ArrayList<>();
		SecurityContext build = SecurityContext.builder()
				.securityReferences(securityReferences())
				.build();
		list.add(build);
		return list;
	}


	private List<SecurityReference> securityReferences() {
		AuthorizationScope scope = new AuthorizationScope("global", "accessEverything");
		AuthorizationScope[] scopes = new AuthorizationScope[1];
		scopes[0] = scope;
		ArrayList<SecurityReference> list = new ArrayList<>();
		list.add(new SecurityReference(GlobalConstant.TOKEN, scopes));
		return list;
	}


	private List<SecurityScheme> securitySchemes() {
		ArrayList<SecurityScheme> list = new ArrayList<>();
		list.add(new ApiKey(GlobalConstant.TOKEN, GlobalConstant.TOKEN, "header"));
		return list;
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title(title)
				.description(description)
				.termsOfServiceUrl(serviceUrl)
				.version(version)
				.build();
	}
}

SwaggerConfig写法

package ycl.springframework.test.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import ycl.springframework.boot.commons.config.BaseSwaggerConfig;

/**
 * swagger配置
 *
 * @author: YCL
 * @date: 2021-06-06 15:00:00
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig extends BaseSwaggerConfig {

	public SwaggerConfig(
			@Value("${project.controllerPackage}") String packageImport) {
		super(packageImport, "swagger-test");//这里从配置文件中注入
	}

}

application.properties

project.controllerPackage=ycl.springframework.test.controller

后言

不忘初心,牢记使命。
让我们携手,互帮互助,取长补短,一起朝各自的目标奋力迈进!!!

由衷感谢您的观看,您的收获和支持就是我的最大动力!!再次感谢!!

End

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot使用MyBatis Plus进行多模块开发的步骤如下: 1. 创建父模块和子模块: 首先创建一个Spring Boot的父模块,然后在该父模块下创建多个子模块。这些子模块可以不同的功能和业务逻辑。 2. 添加依赖: 在父模块的pom.xml文件,添加Spring Boot和MyBatis Plus的依赖。同时,在子模块的pom.xml文件,添加对父模块的依赖。 3. 配置数据源: 在每个子模块的application.properties或application.yml文件配置数据源相关的属性,括数据库连接信息、用户名和密码等。 4. 创建实体类: 在每个子模块的实体类定义数据表对应的字段和属性。 5. 创建Mapper接口: 在一个独立的子模块,创建与数据库表对应的Mapper接口。这个子模块可以被其他子模块引用。 6. 实现Mapper接口: 在对应的子模块,实现Mapper接口,并使用MyBatis Plus提供的注解和方法来简化数据库操作。 7. 配置Mapper扫描: 在每个子模块的配置类或配置文件,配置MyBatis Plus自动扫描Mapper接口的路径。 8. 使用MyBatis Plus进行数据库操作: 在需要进行数据库操作的子模块,注入Mapper接口,并使用MyBatis Plus提供的方法进行CRUD操作。 9. 测试和调试: 使用Swagger等工具进行接口测试,并确保数据库操作的正确性。 总结起来,使用Spring Boot模块开发时,可以将MyBatis Plus的Mapper接口放在一个独立的子模块,其他子模块可以通过引入该子模块来使用Mapper接口。这样可以实现代码的复用和模块的解耦。同时,通过配置MyBatis Plus的相关属性,可以简化数据库操作的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值