我在 Controller 中定义了以下 REST 端点:
@PostMapping(value = "/data",
consumes = { "application/json" },
produces = { "application/json" })
@ResponseBody
public Mono<ServerResponse> create(
final @ApiParam(value = "data", required = true) @Valid @RequestBody Data data) {
Data saved = dataDAO.save(app);
return saved != null
? ServerResponse.created(UriComponentsBuilder.fromPath("data/" + saved.getId()).build().toUri()).
contentType(MediaType.APPLICATION_JSON).
body(BodyInserters.fromObject(saved))
: Mono.error(new CustomException("Error"));
}
但是当我调用/data
时,我收到一个错误: Not Acceptable
:
{
"timestamp": 1562229060618,
"path": "/data",
"status": 406,
"error": "Not Acceptable",
"message": "Could not find acceptable representation"
}
所以我认为我的端点的定义存在一些问题,因为最后数据在我的数据库中正确创建。
我做错了什么?返回 201 Created 状态和我想要的正文(Data
类型)的正确方法是什么?
该错误是否与它无法识别要返回的有效数据有关?
谢谢
最佳答案
关于你的第一个问题,我不知道,因为你还没有发布你的请求是什么样的,或者你的 Data
是什么?对象看起来像所以它可以是任何东西。当您没有全面了解时,解决问题有点困难。
但我要回答你的第二个问题:
what is the right way to return a 201 Created status with the body I want (Data type)?
Data saved = dataDAO.save(app);
上面是一个阻塞调用。它将调用您的数据库并等待,直到它获取您的 Data
反对回来。
因为我不知道你正在使用什么数据库,但这个调用应该包含在 Mono.fromCallable
中这样这个阻塞调用将从 elastic
获得自己的线程根据 react 性文档的线程池 wrap blocking call
return Mono.fromCallable(() -> {
return dataDAO.save(app);
}).subscribeOn(Schedulers.elastic())
.flatMap(data -> {
return ServerResponse.ok().syncBody(data);
});
我不知道你的 dao 中有什么,所以我不会编写任何错误处理,但我会返回一个可选的而不是 null
从此,干净多了。
关于java - 在 Spring Webflux 中返回 201 具有特定主体的创建状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56883884/