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

标签 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时,我收到一个错误: 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/

相关文章:

java - 其他电脑上的Netty连接超时

java - SpringBoot消费REST源,HttpMessageConverter报错

java - 为什么 spring webflux 默认选择 jetty 然后失败?

java - StringTokenizer 和 java.util.Scanner 类有什么区别

Java:当它们不是 getter 时,编写以 "get"开头的方法是不好的做法吗?

spring - SonarQube分析问题

mysql - 在centos tomcat上运行Spring Boot应用程序报错

java - 使用 mapstruct : Error:(22, 映射 48) java: 参数类型 "quote"没有名为 "quote_type"的属性

spring - 那么 spring webflux 中的 thenEmpty、thenMany 和 flatMapMany 是什么?

spring-boot - 如果 Mono 为空,则创建一个未找到的 ServerResponse