swagger 使用Open API进行测试时,带有HttpEntity的Spring Rest控制器API获取空主体

xe55xuns  于 2022-11-06  发布在  Spring
关注(0)|答案(1)|浏览(133)

我使用Sping Boot 2.6.7和使用Open API springdoc-openapi-ui 1.6.4。我有2个服务。从第一个服务,我使用rest模板连接到第二个服务。在第一个服务中,在rest控制器api中,我使用HttpEntity获取请求对象。相同的对象被传递到rest模板。原因是使用HttpEntity,我将传递请求主体以及其他一些头。
我的控制器方法如下。

@PostMapping(value = "/submit", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "API for submit", description = "Submit data")
@ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"),
        @ApiResponse(responseCode = "400", description = "Bad request", content = @Content(schema = @Schema(implementation = Failure.class))),
        @ApiResponse(responseCode = "500", description = "Error", content = @Content(schema = @Schema(implementation = Failure.class))), })
public ResponseEntity<Success<SubmitOpr>> submit(HttpEntity<OperationReq> httpEntity) throws Exception {
    log.info("Request Entity is {}", httpEntity);
    log.info("Request Body is {}", httpEntity.getBody());
    SuccessResponse<SubmitOpr> response = null;
    try {
        response = oprService.submit(httpEntity);
    } catch (Exception e) {
        log.error("Failure: {}", e.getMessage());
        throw e;
    }
    return ResponseEntity.ok().body(response);
}

我的应用程序可以很好地使用这个。和postman客户端也可以很好地使用。但是当我使用swagger UI进行测试时,我没有得到预期的结果。当我调试时,httpEntity.getBody()为空
如果我从HttpEntity<OperationReq> httpEntity更改为OperationReq httpEntity,然后相应地更改后续服务层方法,则API在swagger中工作正常。但我不想更改这一点。因为我想传递HttpEntity,另一件事是有太多类似的API,很难在所有地方都进行更改。
有没有更好的解决办法?

jv4diomz

jv4diomz1#

我对HttpEntity控制器方法参数的行为与Swagger相同。在我的例子中,问题是Swagger将httpEntity作为查询参数而不是body发送。我添加了@io.swagger.v3.oas.annotations.parameters.RequestBody注解,它解决了这个问题:

@io.swagger.v3.oas.annotations.parameters.RequestBody(
    required = true,
    description = "Put here your feature configuration DTO in a JSON format",
    content = @Content(
        mediaType = MediaType.APPLICATION_JSON_VALUE,
        examples = @ExampleObject(value = "{}")
    )
)
HttpEntity<String> httpEntity

相关问题