我在我的应用程序中遇到了一个非常奇怪的行为。
@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上看到的
但是如果我将任何swagger描述添加到我的请求参数中,比如默认值,我在swagger中就看不到这个方法了:
@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
}
我的swagger就是这样配置的
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.
你知道为什么会发生这种情况,以及如何解决吗?
发布于 2021-10-11 11:54:34
在调试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>
https://stackoverflow.com/questions/69524440
复制相似问题