最近公司在弄一个配置化接口平台,以达到低代码,需要为接口提供动态生成的swagger在线文档,接口描述信息记录在数据库内。经过阅读浏览多篇文章,入坑n次,终于得到可行的解决方案,以下分享给各位小伙伴。
方案一:实现ApiListingScannerPlugin,重写apply方法,缺点:每次更新数据库描述信息,需要重启微服务
package com.newpearl.core.service.config;
import com.fasterxml.classmate.TypeResolver;
import com.newpearl.common.dto.Result;
import com.newpearl.common.util.StringUtil;
import com.newpearl.core.api.model.inf.InfApiGroup;
import com.newpearl.core.api.model.inf.InfApiParameter;
import com.newpearl.core.api.model.inf.InfApiSetting;
import com.newpearl.core.biz.dao.inf.InfApiGroupDao;
import com.newpearl.core.biz.dao.inf.InfApiParameterDao;
import com.newpearl.core.biz.dao.inf.InfApiSettingDao;
import org.apache.commons.compress.utils.Sets;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.OperationBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.schema.ModelReference;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.ApiListingScannerPlugin;
import springfox.documentation.spi.service.contexts.DocumentationContext;
import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
/**
* 手动将配置化接口注册到Swagger中,在Swagger-UI才能展示,方便调用。
*
* @author tao
* @Date 2022年8月1日16:02:50
*/
@Component
public class OpenPlatformSwaggerApis implements ApiListingScannerPlugin {
@Autowired
private InfApiGroupDao apiGroupDao;
@Autowired
private InfApiSettingDao apiSettingDao;
@Autowired
private InfApiParameterDao apiParameterDao;
@Override
public List<ApiDescription> apply(DocumentationContext documentationContext) {
String tagName = "配置化接口开放平台";
// documentationContext.getTags().add(new Tag(tagName, "Open Platform Controller"));
List<InfApiSetting> apiSettingList = apiSettingDao.findAll(false);
List<ApiDescription> apiDescriptionList = new ArrayList<>();
//接口配置
for (InfApiSetting apiInfo : apiSettingList) {
List<InfApiParameter> parameterList = apiParameterDao.findByApiCode(apiInfo.getApiCode());
List<Parameter> apiParaList = new ArrayList<>();
//接口参数
for (InfApiParameter parameter : parameterList) {
if (parameter.getOutput() != null && parameter.isOutput()) {
continue;
}
Parameter para = new ParameterBuilder()
.name(StringUtil.isEmpty(parameter.getParaFieldOtherName()) ? parameter.getParaField() : parameter.getParaFieldOtherName())
.description(StringUtil.isEmpty(parameter.getMemo()) ? parameter.getParaField() : parameter.get