Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring WebFlux功能端点抛出404,而不是415,用于无效的媒体类型_Java_Spring_Spring Boot_Spring Webflux - Fatal编程技术网

Java Spring WebFlux功能端点抛出404,而不是415,用于无效的媒体类型

Java Spring WebFlux功能端点抛出404,而不是415,用于无效的媒体类型,java,spring,spring-boot,spring-webflux,Java,Spring,Spring Boot,Spring Webflux,我们正在使用SpringBoot2(v2.0.1.RELEASE)功能端点。我们有这样一个端点: private RequestPredicate getByIdPredicate() { return RequestPredicates.GET("/*/{id}").and(RequestPredicates.accept(MediaType.APPLICATION_JSON_UTF8)); } 当使用错误的媒体类型(例如,application/invalidMediaType)调用A

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

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

当使用错误的媒体类型(例如,
application/invalidMediaType
)调用API时,端点正在抛出
404
。我理解这种行为(两个谓词都不匹配)。但是,我希望它抛出
415不支持的媒体类型
。如何实现这一点?

使用SpringWebFlux fn,
RouterFunction
可以让您完全控制请求映射;同样,处理程序契约非常通用(接受
ServerRequest
,返回
Mono

一切都是为了让你完全掌控;这是有代价的,因为事情需要更明确一点。在您的情况下,内容协商不是为您完成的,您需要在
RequestPredicates
中表达,或者在处理程序级别管理该行为

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

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

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


关于这一点没有硬性规定,WebFlux functional也没有为此提供注册表,原因很好:一个
RouterFunction
只是一个函数,避免共享状态和易变性是一个很好的做法。

如果您使用的是函数接口而不是注释,看起来你必须自己明确定义这种行为。看起来有些疯狂和令人不快,但是文档和api文档似乎并没有显示一个很好的方法来实现这一点。我同意,我可以看到他们在
RequestMappingInfoHandlerMapping#handleNoMatch
方法中编码了异常,但这部分代码从未执行过。Spring WebFlux团队中有人吗?你们能给我一些建议吗?我在想,是否有一种方法可以访问您为这个映射(在
RequestPredicate
和相应的处理程序之间)维护的某种注册表?Brian,我同意您的所有观点;但是请帮助我理解这一点-我配置的
RouterFunction
bean(所有路由都在其处理程序中)在引导过程中只扫描一次(我通过调试代码进行了检查)。那么,除非WebFulx存储映射(RouterFunction到Handler),否则它如何为每个调用调用调用处理程序?我所说的注册是指映射。我想在一个公共位置(一个方面或一个过滤器)而不是在每个处理程序上实现这样的验证,我正在寻找这样一个映射注册表?