簡體   English   中英

在Spring Webflux中返回201帶有特定主體的創建狀態

[英]Return 201 Created status with specific body in Spring Webflux

我在控制器中定義了以下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狀態的正確方法是什么?

該錯誤是否與無法識別要返回的有效數據有關?

謝謝

關於您的第一個問題,我不知道,因為您沒有發布請求的外觀或Data對象的外觀,因此可能是任何東西。 當您沒有全部了解時,這種事情很難解決。

但是我要回答你的第二個問題:

用我想要的主體(數據類型)返回201創建狀態的正確方法是什么?

Data saved = dataDAO.save(app);

上面的,是一個阻止呼叫。 它將調用您的數據庫並等待,直到將其Data對象取回。

由於我不知道您使用的是哪個數據庫,但是此調用應包裝在Mono.fromCallable以便根據反應性文檔wrap阻塞調用 ,此阻塞調用將從elastic線程池中獲取其自己的線程

return Mono.fromCallable(() -> {
    return dataDAO.save(app);
}).subscribeOn(Schedulers.elastic())
  .flatMap(data -> {
      return ServerResponse.ok().syncBody(data);
});

我不知道您的dao中有什么內容,所以我不會編寫任何錯誤處理,但是我會從中返回一個可選的而不是null ,更加簡潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM