Spring WebFlux Functional Endpoint为无效媒体类型抛出404而不是415

时间:2018-05-16 18:14:19

标签: java spring spring-boot spring-webflux

我们正在使用Spring Boot 2(v2.0.1.RELEASE)功能端点。我们有一个这样的端点:

private RequestPredicate getByIdPredicate() {
  return RequestPredicates.GET("/*/{id}").and(RequestPredicates.accept(MediaType.APPLICATION_JSON_UTF8));
}

在使用错误的媒体类型(例如application/invalidMediaType)调用API时,端点正在抛出404。我理解这种行为(两个谓词都不匹配)。但是,我想要抛出415 Unsupported media type。怎么做到这一点?

1 个答案:

答案 0 :(得分:0)

使用Spring WebFlux fn,RouterFunction可以让您完全控制请求映射;同样,处理程序合同非常通用(需要ServerRequest,返回Mono<ServerResponse>)。

一切都旨在让您完全掌控;这需要花费成本,因为事情需要更明确一些。在您的情况下,内容协商不是为您完成的,您需要在RequestPredicates中表达内容或在处理程序级别管理该行为。

在你的情况下,我可以看到几种方法来处理它:

  • 你可以RequestPredicate.nest()谓词;例如,为"/api/*"端点嵌套一个全局路径谓词,并在其下有accept谓词检查正确的媒体类型(然后在其下嵌套其他谓词),并使用返回的特定处理程序所有其他人的HTTP 415

  • 您可以通过查看ServerRequest直接在处理程序中进行检查并从那里返回HTTP 415

对此没有严格的规定,并且WebFlux 功能没有为此提供注册表有一个很好的理由:RouterFunction只是一个功能,避免这是一个好习惯共享状态和可变性。