我使用 Boot 来创建一个简单的托管服务。对于Swagger,我使用SpringFoxv3.0.0和Swagger 2。
因为我从来没有在我的Spring项目中使用过Swagger或OpenAPI,所以我没有什么想法。我对这个方法有一个问题:
@CrossOrigin
@Operation(summary = "Check if a resourcepack exists with the specified id.")
@ApiResponse(responseCode = "200", description = "Resourcepack found", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = ExistsResponse.class))
})
@ApiResponse(responseCode = "400", description = "Bad Request", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))
})
@ApiResponse(responseCode = "403", description = "Blacklisted IP", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))
})
@ApiResponse(responseCode = "429", description = "Too Many Requests (rate-limited)", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = RateLimitResponse.class))
})
@ApiResponse(responseCode = "500", description = "Internal Error (unseen exceptions)", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))
})
@GetMapping(value = "/api/exists/{id:.+}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ExistsResponse> exists(@Parameter(description = "Id of the resourcepack to be checked") @PathVariable String id, HttpServletRequest request) throws InternalErrorException {
当我导航到swagger-ui时,除了ExistsResponse之外的所有模型都出现了以下错误。
2022-08-05 17:29:18.057 ERROR 17372 --- [nio-8080-exec-1] nceModelSpecificationToPropertyConverter : Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='net.iceyleagons.resourcehost.responses', name='ErrorResponse'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}
2022-08-05 17:29:18.058 ERROR 17372 --- [nio-8080-exec-1] nceModelSpecificationToPropertyConverter : Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='net.iceyleagons.resourcehost.responses', name='ErrorResponse'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}
2022-08-05 17:29:18.058 ERROR 17372 --- [nio-8080-exec-1] nceModelSpecificationToPropertyConverter : Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='net.iceyleagons.resourcehost.responses', name='RateLimitResponse'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}
2022-08-05 17:29:18.059 ERROR 17372 --- [nio-8080-exec-1] nceModelSpecificationToPropertyConverter : Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='net.iceyleagons.resourcehost.responses', name='ErrorResponse'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}
我在我的模型上使用了Lombok。下面是我的RateLimitResponse类的一个例子:
@Data
@RequiredArgsConstructor
public class RateLimitResponse {
private final long refill;
private final String error;
public static RateLimitResponse from(RateLimitedException e) {
return new RateLimitResponse(e.getRefill(), e.getMessage());
}
}
作为比较,下面是ExistsResponse:
@Data
@RequiredArgsConstructor
public class ExistsResponse {
private final String downloadUrl;
private final boolean exists;
private final long available;
private final long remainingTokens;
public static ExistsResponse found(String downloadUrl, long available, long remainingTokens) {
return new ExistsResponse(downloadUrl, true, available, remainingTokens);
}
public static ExistsResponse empty(long remainingTokens) {
return new ExistsResponse("", false, -1, remainingTokens);
}
}
我不知道为什么这不会影响ExistsResponse模型,因为它是以完全相同的方式构造的。
2条答案
按热度按时间hrysbysz1#
这里的代码有一些问题。
1.多个@ApiResponse对象未 Package
根据
@ApiResponses
的swagger文档,@ApiResponse
对象必须被 Package 在响应 Package 器中。@ApiResponse
documentation说明“此注解不直接使用,也不会被Swagger解析。它应该在ApiResponses中使用。”1.控制器建议
你应该有一个
@ControllerAdvice
类来管理所有的异常。有一篇很棒的文章介绍了如何做这个here,但是你可以自己找。1.方法签名
你的方法签名是
ResponseEntity<ExistsResponse>
。它不能返回另一个响应(除非你在@ControllerAdvice
中定义它)。如果可能的话,让它成为泛型,比如ResponseEntity<?>
。还有几点需要注意:
1.@Data已经包含
@RequiredArgsConstructor
,因此无需在此处添加该注解。@RequiredArgsConstructor
创建了一个构造函数,该构造函数由标记为@NonNull
的字段组成。在本例中,由于没有以这种方式标注字段,因此@RequiredArgsConstructor
的行为基本上与@NoArgsConstructor
相同。NoArgsConstructor
。除非你同时声明了一个@AllArgsConstructor
和/或一个@NoArgsConstructor
,否则没有必要声明@RerquiredArgsConstructor
。@Data
可以做很多事情。如果你只是把它作为一个简单的对象来使用,也许可以考虑@Value
。4zcjmb1e2#
当我在网上搜索时,我发现SpringFox的当前版本并不真正支持
@ControllerAdvice
(或者更确切地说是Exceptions),并且在GitHub上有一个与此相关的未决问题。(https://github.com/springfox/springfox/issues/521)我能够通过使用springdoc而不是Springfox来修复我的问题。