Как полностью отключить swagger-ui в spring-boot?(/ Swagger-ui.html должен вернуть 404)

Я прочитал следующую тему: Отключение Swagger с Spring MVC

и я написал:

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.project.name.controller"))
            .paths(PathSelectors.ant("/api/**"))
            .build()
            .apiInfo(apiInfo())
            .enable(false);
}

Но в случае, если я пытаюсь получить доступ к Swagger UI: localhost:8080/swagger-ui.html
я вижу

Это выглядит не точно. Могу ли я полностью отключить этот URL? 404 например или как то так.

10 ответов

Решение

Мой ответ похож на ответ, представленный ранее, с небольшой разницей. Я обычно создаю отдельный весенний профиль с именем swagger, Когда я хочу включить Swagger, я запускаю следующий флаг VM при запуске моего приложения, -Dspring.profiles.active=swagger, Вот пример моей конфигурации Swagger,

@Profile(value = {"swagger"})
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
    ...
}

В следующий раз, когда вы попытаетесь получить доступ swagger-ui.html без swagger профиль, вы получите пустой экран Swagger, но не 404.

введите описание изображения здесь

Если вы вообще не хотите загружать статическую страницу пользовательского интерфейса Swagger, вы можете написать простой контроллер, как показано ниже,

@Profile("!swagger")
@RestController
@Slf4j
public class DisableSwaggerUiController {

    @RequestMapping(value = "swagger-ui.html", method = RequestMethod.GET)
    public void getSwagger(HttpServletResponse httpResponse) throws IOException {
        httpResponse.setStatus(HttpStatus.NOT_FOUND.value());
    }
}

Теперь, если вы попытаетесь получить доступ swagger-ui.html без swagger профиль, вы получите 404.

с версией swagger 3.0.0 вы можете добавить springfox.documentation.enabled=false в соответствующий файл профиля среды application.properties. Например, я добавил это в application-prod.properties disable in production (при запуске приложения вы должны указать профиль, используя аргументы виртуальной машины, такие как -Dspring.profiles.active=prod)

Добавление к ответу @Hayden (у меня недостаточно баллов для комментариев ..)

Согласно документации springdoc, вы можете отключить конечные точки API Springdoc и swagger-ui, используя следующие свойства:

https://springdoc.org/#disabling-the-springdoc-openapi-endpoints

      # Disabling the /v3/api-docs enpoint
springdoc.api-docs.enabled=false

https://springdoc.org/#disable-the-swagger-ui

      # Disabling the swagger-ui
springdoc.swagger-ui.enabled=false

Вы можете вывести @EnableSwagger2 к своему собственному @Configruation и загрузить его условно через свойство или профиль. например

@Profile("!production")
@Configuration
@EnableSwagger2
public class SwaggerConfiguration{
    //Additional Swagger Beans

}

Это активирует Swagger для любого профиля, который не является производственным.

Если у вас нет аннотаций Swagger внутри контроллеров... просто исключите зависимости SwaggerConfig.class и swagger при сборке

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>com/company/app/SwaggerConfig.java</exclude>
                </excludes>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>io.springfox</groupId>
                        <artifactId>springfox-swagger-ui</artifactId>
                    </exclude>
                    <exclude>
                        <groupId>io.springfox</groupId>
                        <artifactId>springfox-swagger2</artifactId>
                    </exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Для пользователей SpringDoc добавьте это в свой application.properties

      springdoc.api-docs.enabled=false

Чтобы отключить Swagger, только когда prod профиль активен, добавьте его в свой application-prod.properties вместо

В последней версии весенней загрузки вы можете добавить это в свой application.yml:

      springdoc:
  swagger-ui:
    enabled: false
  api-docs:
    enabled: false

Таким образом, этот ключ swagger-ui используется для отключения интерфейса swagger, а ключ api-docs используется для отключения маршрута, на котором обслуживается JSON, описывающий ваш API.

В моей конфигурации у меня есть профиль prod , который читает application-prod.yml, содержащий эти строки.

При использовании зависимости springdoc-openapi-ui можно отключить swagger-ui через свойство:

      springdoc.swagger-ui.enabled=false

как указано в Spring Doc FAQ.

Для тех, кто использует генерацию кода:

@Controller
@Profile({"dev", "staging"})
public class HomeController {
    @RequestMapping(value = "/")
    public String index() {
        System.out.println("swagger-ui.html");
        return "redirect:swagger-ui.html";
    }
}

И добавьте вам файл.swagger-codegen-ignore, иначе ваши изменения будут перезаписаны при следующей сборке maven

Просто удалите зависимость.

      <!--<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
</dependency>-->

Это не влияет на компиляцию.

Другие вопросы по тегам