首页 > 解决方案 > Swagger 描述在 Spring Boot 应用程序中隐藏端点

问题描述

我在我的应用程序中遇到了一个非常奇怪的行为。

@RestController
@RequestMapping("users")
@Validated
@Api(tags = "User controller v2")
public class UserController {

    @ApiOperation(value = "Get details of a user by id")
    @ApiResponses(value = {@ApiResponse(code = 400, message = "Bad Request"),
        @ApiResponse(code = 401, message = "Authorization information is missing or invalid."),
        @ApiResponse(code = 403, message = "Requested resource is forbidden for current user"),
        @ApiResponse(code = 200, message = "OK")})
    @GetMapping("/{userId}")
    public ResponseEntity<User> getUserDetails(@PathVariable @NotNull String userId) {
        // calling service methods
    }
}

这很好用,这就是我在 /swagger-ui.html 上看到的 在此处输入图像描述

但是,如果我将任何招摇的描述添加到我的请求参数中,比如默认值,我就再也看不到招摇的这个方法了:

@ApiOperation(value = "Get details of a user by id")
@ApiResponses(value = {@ApiResponse(code = 400, message = "Bad Request"),
    @ApiResponse(code = 401, message = "Authorization information is missing or invalid."),
    @ApiResponse(code = 403, message = "Requested resource is forbidden for current user"),
    @ApiResponse(code = 200, message = "OK")})
@GetMapping("/{userId}")
public ResponseEntity<User> getUserDetails(
    @ApiParam(defaultValue = "12345") @PathVariable @NotNull String userId) {
    // calling service methods
}

在此处输入图像描述

这就是我的招摇配置

public class WebConfiguration {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
            .securitySchemes(Collections.singletonList(apiKey()))
            .securityContexts(Collections.singletonList(securityContext()))
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.test"))
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("My test service")
            .version("2.0")
            .build();
    }

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

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

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[] {authorizationScope};
        return Collections.singletonList(new SecurityReference("JWT", authorizationScopes));
    }
}

此外,在我的应用程序日志中,我看到这样的消息:

ERROR [,,,] 36927 --- [  restartedMain] s.d.s.web.scanners.ApiDescriptionReader  : Skipping process path[/api/v2/users/{userId}], method[getUserDetails] as it has an error.

任何想法为什么会发生以及如何解决它?

标签: javaspringspring-bootswagger

解决方案


在调试 Spring 上下文时,我在 ApiDescriptionReader 类中发现了这样的错误:

java.lang.NoSuchMethodError: io.swagger.annotations.ApiParam.allowEmptyValue()Z

我通过添加这个依赖解决了这个问题:

<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.6.2</version>
</dependency>

推荐阅读