Swagger:无法找到实际存在的模型

piztneat  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(522)

我使用 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模型,因为它是以完全相同的方式构造的。

hrysbysz

hrysbysz1#

这里的代码有一些问题。
1.多个@ApiResponse对象未 Package
根据@ApiResponses的swagger文档,@ApiResponse对象必须被 Package 在响应 Package 器中。@ApiResponse documentation说明“此注解不直接使用,也不会被Swagger解析。它应该在ApiResponses中使用。”
1.控制器建议
你应该有一个@ControllerAdvice类来管理所有的异常。有一篇很棒的文章介绍了如何做这个here,但是你可以自己找。
1.方法签名
你的方法签名是ResponseEntity<ExistsResponse>。它不能返回另一个响应(除非你在@ControllerAdvice中定义它)。如果可能的话,让它成为泛型,比如ResponseEntity<?>
还有几点需要注意:
1.@Data已经包含@RequiredArgsConstructor,因此无需在此处添加该注解。

  1. @RequiredArgsConstructor创建了一个构造函数,该构造函数由标记为@NonNull的字段组成。在本例中,由于没有以这种方式标注字段,因此@RequiredArgsConstructor的行为基本上与@NoArgsConstructor相同。
  2. Java会在编译时自动为一个没有构造函数的类创建一个NoArgsConstructor。除非你同时声明了一个@AllArgsConstructor和/或一个@NoArgsConstructor,否则没有必要声明@RerquiredArgsConstructor
  3. @Data可以做很多事情。如果你只是把它作为一个简单的对象来使用,也许可以考虑@Value
4zcjmb1e

4zcjmb1e2#

当我在网上搜索时,我发现SpringFox的当前版本并不真正支持@ControllerAdvice(或者更确切地说是Exceptions),并且在GitHub上有一个与此相关的未决问题。(https://github.com/springfox/springfox/issues/521
我能够通过使用springdoc而不是Springfox来修复我的问题。

相关问题