我正在使用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已將所有欄位設定為“空”。我找不到正確接收尸體的方法。
我明白,我可以使用objectMapper并轉換playCommand回 JSON,但這是不需要完成的額外作業。是否可以以兩種不同的形式接收請求正文?或者,我在我的例子中做錯了什么?
uj5u.com熱心網友回復:
擁有多個@RequestBody是不可能的。如果你真的需要原始 JSON 和它的序列化版本,你能做的最好的事情就是接收請求體作為一個普通的String,然后將它轉換為相應的 Java 物件,如下所示:
@Autowired
private ObjectMapper objectMapper;
@PostMapping("/play")
public Mono<PlayResponse> play(@RequestBody String body){
PlayCommand playCommand = objectMapper.readValue(body, PlayCommand.class);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/343525.html
標籤:爪哇 春天 弹簧-webflux
