我在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
时,我得到了Error: Not Acceptable
:
{
"timestamp": 1562229060618,
"path": "/data",
"status": 406,
"error": "Not Acceptable",
"message": "Could not find acceptable representation"
}
所以我认为端点的定义存在一些问题,因为最后数据是在数据库中正确创建的。
我在做什么错?用我想要的主体(Data
类型)返回201 Created状态的正确方法是什么?
该错误是否与无法识别要返回的有效数据有关?
谢谢
答案 0 :(得分:0)
关于您的第一个问题,我不知道,因为您没有发布请求的外观或Data
对象的外观,因此可以是任何东西。当您没有全貌时,很难解决问题。
但是我要回答你的第二个问题:
用我想要的主体(数据类型)返回201 Created状态的正确方法是什么?
Data saved = dataDAO.save(app);
以上,是一个阻止呼叫。它将调用您的数据库并等待,直到它返回您的Data
对象。
由于我不知道您使用的是哪个数据库,但应将此调用包装在Mono.fromCallable
中,以便根据响应,此阻塞调用将从elastic
线程池中获得其自己的线程文档wrap blocking call
return Mono.fromCallable(() -> {
return dataDAO.save(app);
}).subscribeOn(Schedulers.elastic())
.flatMap(data -> {
return ServerResponse.ok().syncBody(data);
});
我不知道您的dao中有什么内容,因此我不会编写任何错误处理,但是我会从中返回一个可选的选项,而不是null
,更加简洁。