我使用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,很难在所有地方都进行更改。
有没有更好的解决办法?
1条答案
按热度按时间jv4diomz1#
我对HttpEntity控制器方法参数的行为与Swagger相同。在我的例子中,问题是Swagger将httpEntity作为查询参数而不是body发送。我添加了@io.swagger.v3.oas.annotations.parameters.RequestBody注解,它解决了这个问题: