在Spring Webflux中返回201带有特定主体的创建状态

时间:2019-07-04 08:41:32

标签: java spring-boot spring-webflux springfox

我在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状态的正确方法是什么?

该错误是否与无法识别要返回的有效数据有关?

谢谢

1 个答案:

答案 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,更加简洁。