Springfox Swagger 2.0의 basePath를 변경하는 방법
Swagger UI에 액세스할 수 있는 서비스를 실행하고 있습니다.
http://serviceURL/swagger-ui.html
단, 다음과 같은 프록시의 배후에 있습니다.
http://proxyURL/serviceName
Swagger UI에 의해 생성된 URL은 다음과 같습니다.
http://proxyURL/
serviceName을 서픽스로 하는 실제 URL 대신 사용합니다.제가 알기론 basePath 속성을 조작하는 것을 의미합니다.설명서에 따르면:
Swagger API 문서에서는 더 이상 다른 기본 경로에서의 작업을 설명할 수 없습니다.1.2 이전 버전에서는 각 리소스에 별도의 basePath가 있을 수 있습니다.2.0에서는 규격 전체에 대해 basePath 등가물(scemes+host+basePath)이 정의되어 있습니다.
@Api(basePath)는 더 이상 사용되지 않으며 무엇을 어떻게 사용해야 하는지 알 수 없습니다.어떻게 하면 스웨거가 만든 경로를 제대로 표시할 수 있을까요?
스프링 부츠, 스프링폭스 스웨거 그리고 주석을 사용하고 있어요
@Bean
public Docket newsApi(ServletContext servletContext) {
return new Docket(DocumentationType.SWAGGER_2).pathProvider(new RelativePathProvider(servletContext) {
@Override
public String getApplicationBasePath() {
return "/serviceName" + super.getApplicationBasePath();
}
}).host("proxyURL");
}
다음과 같이 Swagger Configuration을 편집할 수 있습니다.
교환에 주의해 주십시오.
package
(REST 컨트롤러가 탑재되어 있어야 함),host
, 및PATH
필요.
@Configuration
@EnableSwagger2
public class SwaggerConfiguration implements WebMvcConfigurer {
public static final String PATH = "/serviceName";
@Bean
public Docket api() {
final var package = "com.martin.rest";
final var host = "localhost:8080";
return new Docket(DocumentationType.SWAGGER_2)
.host(host)
.select()
.apis(RequestHandlerSelectors.basePackage(package))
.paths(PathSelectors.any())
.build();
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
final var apiDocs = "/v2/api-docs";
final var configUi = "/swagger-resources/configuration/ui";
final var configSecurity = "/swagger-resources/configuration/security";
final var resources = "/swagger-resources";
registry.addRedirectViewController(PATH + apiDocs, apiDocs).setKeepQueryParams(true);
registry.addRedirectViewController(PATH + resources, resources);
registry.addRedirectViewController(PATH + configUi, configUi);
registry.addRedirectViewController(PATH + configSecurity, configSecurity);
registry.addRedirectViewController(PATH, "/");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(PATH + "/**").addResourceLocations("classpath:/META-INF/resources/");
}
}
다른 해결 방법은 스프링 부트 URL 컨텍스트 경로를 변경하는 것입니다.
붓기 편집application.properties
파일:
server.servlet.context-path=/serviceName
또는,application.yml
파일:
server:
servlet:
context-path: /serviceName
경고:Swagger 뿐만 아니라 모든 웹 서비스의 기본 경로를 변경할 것입니다.
spring fox 2.9.2를 사용하면 다른 사용자가 언급한 솔루션을 사용할 수 없습니다.
동작하지 않는 점:
- Docket pathProvider에서 getApplicationBasePath를 재정의하고 있습니다.
- server.servlet.context-path=/serviceName을(를) 추가하는 중
Springboot 2.1.6을 사용하는 제 프로젝트에서는 왜 작동하지 않는지 모르겠습니다.릴리스 및 스프링 5.1.8.RELEASE, 위의 두 가지 솔루션이 무시되고 있습니다.
또 다른 접근방식을 시도하고 있습니다.https://github.com/springfox/springfox/issues/2817#issuecomment-517753110
Github 이슈 코멘트에 따르면, Springfox json serialize class를 덮어쓰고 효과가 있어서 다행이라고 합니다.다음은 코드 예시입니다.
import io.swagger.models.Swagger;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import springfox.documentation.spring.web.json.JacksonModuleRegistrar;
import springfox.documentation.spring.web.json.Json;
import springfox.documentation.spring.web.json.JsonSerializer;
import java.util.Arrays;
import java.util.List;
import static io.github.jhipster.config.JHipsterConstants.SPRING_PROFILE_PRODUCTION;
@Component
@Primary
public class CustomBasePathSerialize extends JsonSerializer {
// this injection is optional, if you don't need to
// add basePath based on active profile, remove this.
private final Environment env;
public CustomBasePathSerialize(List<JacksonModuleRegistrar> modules,
Environment env) {
super(modules);
this.env = env;
}
@Override
public Json toJson(Object toSerialize) {
if (toSerialize instanceof Swagger) {
Swagger swagger = (Swagger) toSerialize;
String basePath = "/serviceName";
List<String> profiles = Arrays.asList(env.getActiveProfiles());
// OPTIONAL: you can change basePath if you have difference path
// on any Spring profile, for example prod:
if (profiles.contains(SPRING_PROFILE_PRODUCTION)) {
basePath = "/";
}
swagger.basePath(basePath);
}
return super.toJson(toSerialize);
}
}
다음 설정을 application.yaml 파일에 추가했습니다.
springdoc:
swagger-ui:
configUrl: /pathProvider/v3/api-docs/swagger-config
disable-swagger-default-url: true
urls[0]:
url: /pathProvider/v3/api-docs/mobile-bff
name: pathName
여기서 pathProvider는 오래된 swagger 2 yaml의 PathProvider 구성으로 대체해야 합니다.
또한 Open에 서버를 추가해야 했습니다.동일한 PathProvider 이름을 가진 API 개체입니다.
@Bean fun springShopOpenAPI(): OpenAPI? { return OpenAPI().addServersItem(Server().url("/pathProvider"))
언급URL : https://stackoverflow.com/questions/36198827/how-to-change-basepath-for-springfox-swagger-2-0
'programing' 카테고리의 다른 글
AngularJS를 사용하여 옵션 텍스트 값을 얻는 방법 (0) | 2023.03.27 |
---|---|
타입 'JSX'에 속성이 존재하지 않는다고 타이프 스크립트가 불만을 제기합니다.React.createClass를 사용할 때 'Intelligent Elements'를 선택하십시오. (0) | 2023.03.27 |
개체와 해시의 차이점? (0) | 2023.03.22 |
@ComponentScan과 @Enable의 차이점은 무엇입니까?스프링 부트에서의 자동 설정 (0) | 2023.03.22 |
AJAX 호출에서 success() 또는 complete()를 사용합니다. (0) | 2023.03.22 |