programing

Springfox Swagger 2.0의 basePath를 변경하는 방법

i4 2023. 3. 22. 20:45
반응형

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

반응형