本文介紹了Spring WebFlux。如何使用@RequestBody注釋獲取兩種不同格式的請求正文?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我使用的是Spring Boot 2.5.6和Spring WebFlux。在我的業務案例中,我需要以兩種不同的形式使用HTTP請求正文:
-
原始JSON字符串
已分析Java DTO
有我的RestContoller
:
@PostMapping("/play")
public Mono<PlayResponse> play(@RequestBody PlayCommand parsedBody,
@RequestBody String jsonBody) {
//code here
}
當我運行測試時,我收到下一個異常:
java.lang.IllegalStateException: Only one connection receive subscriber allowed.
at reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:182) ~[reactor-netty-core-1.0.12.jar:1.0.12]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
*__checkpoint ? HTTP POST "/play" [ExceptionHandlingWebHandler]
當我使用下一個方法簽名時:
@PostMapping("/play")
public Mono<PlayResponse> play(PlayCommand playCommand,
@RequestBody String body){
//code here
}
PlayCommand parsedBody
將所有字段設置為‘NULL’。
我找不到正確接收身體的方法。
我理解,我可以使用objectMapper
并將playCommand
轉換回JSON,但這是不需要完成的額外工作。
可以以兩種不同的形式接收請求正文嗎?或者,也許我在示例中做錯了什么?
推薦答案
不可能有多個@RequestBody
。如果您確實需要原始JSON及其序列化版本,最好的方法是以普通String
的形式接收請求正文,然后將其轉換為相應的Java對象,如下所示:
@Autowired
private ObjectMapper objectMapper;
@PostMapping("/play")
public Mono<PlayResponse> play(@RequestBody String body){
PlayCommand playCommand = objectMapper.readValue(body, PlayCommand.class);
}
這篇關于Spring WebFlux。如何使用@RequestBody注釋獲取兩種不同格式的請求正文?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,