Как скрыть конечные точки из документации Swagger с помощью Springfox

У меня есть проект Spring Boot со следующей зависимостью от Springfox:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
    <scope>compile</scope>
</dependency>

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

И у меня есть свой интерфейс:

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import springfox.documentation.annotations.ApiIgnore;

@RestController
@RequestMapping(value = "/cache")
@ApiIgnore
@Api(hidden = true)
public interface CacheController {

    @RequestMapping(
        value = "clear/",
        method = RequestMethod.GET,
        produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_PLAIN_VALUE}
    )
    @ApiOperation(value = "", hidden = true)
    ResponseEntity<String> clearToken();
}

Аннотации @ApiIgnore и @Api(hidden = true) (я тестировал их отдельно, и они тоже не работают) не имеют эффекта скрытия документации. Это работает только в том случае, если аннотация находится над методом, но я хотел бы скрыть их все, поскольку у меня есть другие конечные точки, которые я хотел бы скрыть.

Некоторые идеи?

РЕДАКТИРОВАТЬ:

Это моя конфигурация Swagger:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    public static String API_KEY_NAME;

    @Bean
    public Docket apiDocumentation() {
        List<ResponseMessage> errorList = this.defineResponseMessages();

        return new Docket(DocumentationType.SWAGGER_2)  
          .select()       
          .apis(RequestHandlerSelectors.basePackage("my.package.rest"))              
          .paths(PathSelectors.any())                          
          .build()
          .useDefaultResponseMessages(true)
          .globalResponseMessage(RequestMethod.GET, errorList)
          .securitySchemes(Arrays.asList(this.apiKey()))
          .securityContexts(Arrays.asList(this.securityContext()))
          .apiInfo(this.apiInfo());                                          
    }

    @Value("${server.security.apiKeyName}")
    public void setApiKeyName(final String apiKeyName) {
        SwaggerConfig.API_KEY_NAME = apiKeyName;
    }

    private ApiKey apiKey() {
        return new ApiKey("apiKey", API_KEY_NAME, "header");
    }

    private SecurityContext securityContext() {
        return SecurityContext.builder()
            .securityReferences(defaultAuth())
            .forPaths(PathSelectors.any()).build();
    }

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Arrays.asList(new SecurityReference("apiKey", authorizationScopes));
    }

    private List<ResponseMessage> defineResponseMessages() {
        List<ResponseMessage> errorList = new ArrayList<ResponseMessage>();

        ResponseMessage responseMessage = new ResponseMessageBuilder()
            .code(HttpStatus.INTERNAL_SERVER_ERROR.value())
            .message(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
            .build();

        errorList.add(responseMessage);

        responseMessage = new ResponseMessageBuilder()
                .code(HttpStatus.UNAUTHORIZED.value())
                .message(HttpStatus.UNAUTHORIZED.getReasonPhrase())
                .build();

        errorList.add(responseMessage);

        responseMessage = new ResponseMessageBuilder()
                .code(HttpStatus.NOT_FOUND.value())
                .message(HttpStatus.NOT_FOUND.getReasonPhrase())
                .build();

        errorList.add(responseMessage);

        return errorList;
    }

    private ApiInfo apiInfo() {
        ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
        return apiInfoBuilder
            .title("My API")
            .description("Description")
            .version("1.0.0 Beta")
            .build();
    }
}

person Alberto    schedule 05.03.2019    source источник
comment
Как выглядит ваша конфигурация Swagger Docket?   -  person Hermann Steidel    schedule 06.03.2019
comment
Я отредактировал сообщение, добавив конфигурацию Swagger.   -  person Alberto    schedule 06.03.2019


Ответы (5)


Вы добавили аннотацию @ApiIgnore к интерфейсу. Похоже, эта аннотация не работает при добавлении в интерфейс. (Я действительно не понимаю, почему @Api работает на интерфейсе, а @ApiIgnore нет. ????)

Добавьте аннотацию непосредственно в класс вашего контроллера. Это должно решить вашу проблему.

Свойство hidden в аннотации @Api в настоящее время не работает. (См. эту проблему GitHub.)

person Matt Ke    schedule 06.03.2019

Еще один способ - использовать @ApiOperation(hidden = true) Это можно использовать на уровне контроллера/обработчика. Например.

@RestController
public HomeController{
@ApiOperation(value = "<Your Message>", hidden = true)
    public String getMessage(@RequestParam(value = "msg") final String msg){
        return msg;
    }
}
person Purushotham CK    schedule 13.05.2019
comment
Я тоже решился на операцию. По моим документам был в интерфейсе. Рекомендую. - person bpedroso; 25.05.2020

Для OpenAPI3 и SpringBoot:
я использовал аннотацию @Hidden для метода контроллера.
Кажется, она работает как на уровне метода, так и на уровне контроллера.

Аннотация @Hidden была импортирована с использованием:

import io.swagger.v3.oas.annotations;
person u33how    schedule 06.04.2020

Сценарий, в котором мы хотим скрыть только определенные методы класса. Для swagger.v3 есть аннотация с именем Hidden в io.swagger.core.v3:swagger-annotations:2.0.10 jar. Методы, которые нужно скрыть, можно пометить аннотацией Hidden, как показано ниже. В приведенном ниже методе показан метод с операцией DELETE, которую необходимо скрыть из документации swagger.

@DELETE
@Hidden
public void deleteList(int id) {
//code goes here.
}
person user2122524    schedule 03.03.2020

Другой вариант - просто полностью удалить @Api, и ваш контроллер и его методы не должны быть подхвачены чванством.

person Good Lux    schedule 20.11.2019