我们正在使用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
。怎么做到这一点?
答案 0 :(得分:0)
使用Spring WebFlux fn,RouterFunction
可以让您完全控制请求映射;同样,处理程序合同非常通用(需要ServerRequest
,返回Mono<ServerResponse>
)。
一切都旨在让您完全掌控;这需要花费成本,因为事情需要更明确一些。在您的情况下,内容协商不是为您完成的,您需要在RequestPredicates
中表达内容或在处理程序级别管理该行为。
在你的情况下,我可以看到几种方法来处理它:
你可以RequestPredicate.nest()
谓词;例如,为"/api/*"
端点嵌套一个全局路径谓词,并在其下有accept
谓词检查正确的媒体类型(然后在其下嵌套其他谓词),并使用返回的特定处理程序所有其他人的HTTP 415
您可以通过查看ServerRequest
直接在处理程序中进行检查并从那里返回HTTP 415
对此没有严格的规定,并且WebFlux 功能没有为此提供注册表有一个很好的理由:RouterFunction
只是一个功能,避免这是一个好习惯共享状态和可变性。