【问题标题】:Hide a method in springdoc-openapi based on a condition根据条件隐藏springdoc-openapi中的方法
【发布时间】:2021-12-07 11:52:25
【问题描述】:
我们正在开发一个使用 springdoc-openapi 库生成 swagger 文档的 spring boot 项目。我们有一个要求,我们需要在控制器中隐藏一些 API。
Spring boot 确实提供了一种使用 @ConditionalOnProperty 标记隐藏/显示控制器的方法。但是spring boot没有办法隐藏/显示基于属性的方法。
springdoc-openapi 是否提供了在扫描所有控制器后过滤操作的方法?或任何其他基于属性隐藏/显示某些 API 的方法。
【问题讨论】:
标签:
spring-boot
spring-boot-actuator
springdoc-openapi-ui
springdoc-ui
【解决方案1】:
您可以像这样覆盖 springdoc 的 OperationService#isHidden 行为:
package alex.swaggerhidden.service;
import org.springdoc.core.GenericParameterService;
import org.springdoc.core.OperationService;
import org.springdoc.core.PropertyResolverUtils;
import org.springdoc.core.RequestBodyService;
import org.springdoc.core.SecurityService;
import org.springdoc.core.providers.JavadocProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Optional;
@Component
@Primary
public class MyOperationService extends OperationService {
private final boolean exposeHidden;
public MyOperationService(GenericParameterService parameterBuilder, RequestBodyService requestBodyService, SecurityService securityParser, PropertyResolverUtils propertyResolverUtils, Optional<JavadocProvider> javadocProvider, @Value("${app.expose-hidden}") boolean exposeHidden) {
super(parameterBuilder, requestBodyService, securityParser, propertyResolverUtils, javadocProvider);
this.exposeHidden = exposeHidden;
}
@Override
public boolean isHidden(Method method) {
if (exposeHidden) {
return false;
}
return super.isHidden(method);
}
}
现在如果app.expose-hidden 设置为TRUE,隐藏行为将被忽略
app:
expose-hidden: true