背景
重新创建一个新的maven工程,按照芋道源码ruoyi-pro官方文档生成代码后,新的maven工程目录下的接口不能被swagger扫描到,swagger-ui不显示新增的maven工程模块下的api。
解决方法
- 新增maven工程类中,新增swagger扫描配置类
import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* office 模块的 web 组件的 Configuration
*
* @author 芋道源码
*/
@Configuration(proxyBeanMethods = false)
public class OfficeWebConfiguration {
/**
* office模块的 API 分组
*/
@Bean(name = "officeGroupedOpenApi")
public GroupedOpenApi officeGroupedOpenApi() {
return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("office");
}
}
简答:查看框架源码可以看到此bean调用的swagger配置方法将以office分组开头,扫描拼接后的office前缀的api,如下代码
// ========== 分组 OpenAPI 配置 ==========
/**
* 所有模块的 API 分组
*/
@Bean
public GroupedOpenApi allGroupedOpenApi() {
return buildGroupedOpenApi("all", "");
}
public static GroupedOpenApi buildGroupedOpenApi(String group) {
return buildGroupedOpenApi(group, group);
}
public static GroupedOpenApi buildGroupedOpenApi(String group, String path) {
return GroupedOpenApi.builder()
.group(group)
.pathsToMatch("/admin-api/" + path + "/**", "/app-api/" + path + "/**")
.addOperationCustomizer((operation, handlerMethod) -> operation
.addParametersItem(buildTenantHeaderParameter())
.addParametersItem(buildSecurityHeaderParameter()))
.build();
}
- 将新增的maven工程包放到启动类所在的工程中(
yudao-server
),供启动类加载新增的maven工程,并将新增的maven工程加载到spring容器中。
这时候就会发现我们新增的配置类中的图标就会发生改变,可以看到我们写的配置类已经注入到了spring容器中了。,这个时候在访问接口文档就会发现office模块已经可以看到了。
controller接口中的/api-admin/**,是在哪里拼接的?
找到我们的YudaoWebAutoConfiguration.java
,如下代码中可以看到我们的接口中的前缀在这里加入的。
可以发现方法中先判断扫描的类中有你没有加入@RestController
注解,然后在拼接接口前缀。
/**
* 设置 API 前缀,仅仅匹配 controller 包下的
*
* @param configurer 配置
* @param api API 配置
*/
private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) {
AntPathMatcher antPathMatcher = new AntPathMatcher(".");
configurer.addPathPrefix(api.getPrefix(), clazz -> clazz.isAnnotationPresent(RestController.class)
&& antPathMatcher.match(api.getController(), clazz.getPackage().getName())); // 仅仅匹配 controller 包
}
打开WebProperties.Api
类中,可以看到拼接的前缀信息。如下
@Data
public class WebProperties {
@NotNull(message = "APP API 不能为空")
private Api appApi = new Api("/app-api", "**.controller.app.**");
@NotNull(message = "Admin API 不能为空")
private Api adminApi = new Api("/admin-api", "**.controller.admin.**");
@NotNull(message = "Admin UI 不能为空")
private Ui adminUi;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Valid
public static class Api {
/**
* API 前缀,实现所有 Controller 提供的 RESTFul API 的统一前缀
*
*
* 意义:通过该前缀,避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部,带来安全性问题
* 这样,Nginx 只需要配置转发到 /api/* 的所有接口即可。
*
* @see YudaoWebAutoConfiguration#configurePathMatch(PathMatchConfigurer)
*/
@NotEmpty(message = "API 前缀不能为空")
private String prefix;
/**
* Controller 所在包的 Ant 路径规则
*
* 主要目的是,给该 Controller 设置指定的 {@link #prefix}
*/
@NotEmpty(message = "Controller 所在包不能为空")
private String controller;
}