gpt4 book ai didi

java - 缺少 Spring Reactive Web 应用程序 POST 请求正文

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:46:59 25 4
gpt4 key购买 nike

我从事小型测试项目,以检查 Spring Reactive Web 应用程序实际上如何与 MongoDB 协同工作。

我遵循 https://docs.spring.io/spring/docs/5.0.0.M4/spring-framework-reference/html/web-reactive.html 中的手册

它声明我可以像这样在 Controller 中处理 POST 请求:

@PostMapping("/person")
Mono<Void> create(@RequestBody Publisher<Person> personStream) {
return this.repository.save(personStream).then();
}

虽然这似乎行不通。这里是我实现的 Controller :

https://github.com/pavelmorozov/reactor-poc/blob/master/src/main/java/com/springreactive/poc/controller/BanquetHallController.java

它只有一个 POST 映射,而且非常简单:

@PostMapping("/BanquetHall")
Mono<Void> create(@RequestBody Publisher<BanquetHall> banquetHallStream) {
return banquetHallRepository.insert(banquetHallStream).then();
}

每次我使用 curl 发出 POST 时都会调用它:

curl -v -XPOST -H "Content-type: application/json" -d '{"name":"BH22"}' 'http://localhost:8080/BanquetHall'
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /BanquetHall HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.47.0
> Accept: */*
> Content-type: application/json
> Content-Length: 15
>
* upload completely sent off: 15 out of 15 bytes
< HTTP/1.1 200 OK
< content-length: 0
<
* Connection #0 to host localhost left intact

而且我看到新对象存储在 mongodb 中,但它们不包含数据。为了调试,我构建了简单的订阅者,以查看实际作为请求主体传递给 Controller ​​的数据:

Subscriber s = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
logger.info("Argument: "+s.toString());
}
@Override
public void onNext(Object t) {
logger.info("Argument: "+t.toString());

}
@Override
public void onError(Throwable t) {
logger.info("Argument: "+t.toString());
}
@Override
public void onComplete() {
logger.info("Complete! ");
}
};
banquetHallStream.subscribe(s);

现在我看到订阅后调用了 onError 方法。 Throwable 状态主体丢失:

Request Error 400

Here error string:
Request body is missing: reactor.core.publisher.Mono<java.lang.Void> com.springreactive.poc.controller.BanquetHallController.create(org.reactivestreams.Publisher<com.springreactive.poc.domain.BanquetHall>)

为什么请求体是空的?

同样很高兴知道:当我对所有这些响应式内容感到陌生时,是否可以使用一些更好的方法来调试发布者/订阅者而无需手动实现订阅者?

更新 我更新了 POST 处理程序方法描述并将请求正文作为字符串对象传递:

Mono<Void> create(@RequestBody String banquetHallStream)

那这不是“Reactive”,对吧? String 不是 react 性的,因为 Publisher 应该是...

最佳答案

我遇到了完全相同的问题,并且能够通过将 @ResponseStatus 放在方法上来解决它。下面是方法 Controller 的样子:

@ResponseStatus(HttpStatus.CREATED)
@PostMapping(value = "/bulk", consumes = APPLICATION_STREAM_JSON_VALUE)
public Mono<Void> bulkInsert(@RequestBody Flux<Quote> quotes) {
return quoteReactiveRepository.insert(quotes).then();
}

我正在使用 WebClient 向该端点发出请求:

webClient.post()
.uri("/quotes/bulk")
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body(flux(), Quote.class)
.retrieve()
.bodyToMono(Void.class).block();

测试:org.springframework.boot:spring-boot-starter-webflux:2.1.0.RELEASE

关于java - 缺少 Spring Reactive Web 应用程序 POST 请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com