java - 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.
任何想法为什么会发生以及如何解决它?
解决方案
在调试 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>
推荐阅读
- joi - Joi 当兄弟姐妹然后在根目录添加额外的规则
- mysql - nodejs-mysql 中多个占位符的一个值
- angular - '来自 Google 的 API 密钥公开' Angular 应用程序在 github 存储库中
- javascript - 如何在Javascript中访问父类成员函数的输入参数
- python - 如何对数据集进行排序和排名
- python - Python 多重赋值会引发错误,但单独赋值不会
- javascript - 如何在我到达 div 之前阻止水平滚动
- html - CSS BugFix - 双滚动条
- python - 无法测试列表中的事物是否存在于python中
- python - 如何使用 Beautiful Soup(模态容器)抓取 HTML 数据端点