diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java index aac9d48ea396..d4011e05a8ff 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java @@ -60,6 +60,7 @@ import org.springframework.web.reactive.result.method.InvocableHandlerMethod; import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver; import org.springframework.web.reactive.result.method.SyncInvocableHandlerMethod; +import org.springframework.web.server.NotAcceptableStatusException; import org.springframework.web.server.ServerWebExchange; /** @@ -416,7 +417,15 @@ private InvocableHandlerMethod createAttributeMethod(Object bean, Method method) public InvocableHandlerMethod getExceptionHandlerMethod(Throwable ex, ServerWebExchange exchange, @Nullable HandlerMethod handlerMethod) { Class handlerType = (handlerMethod != null ? handlerMethod.getBeanType() : null); - List requestedMediaTypes = this.contentTypeResolver.resolveMediaTypes(exchange); + List requestedMediaTypes = List.of(MediaType.ALL); + try { + requestedMediaTypes = this.contentTypeResolver.resolveMediaTypes(exchange); + } + catch (NotAcceptableStatusException exc) { + if (logger.isDebugEnabled()) { + logger.debug("Could not parse Accept header for requested media types", exc); + } + } // Controller-local first if (handlerType != null) { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolverTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolverTests.java index 7d582a95d331..f45585a26c6d 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolverTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolverTests.java @@ -258,6 +258,18 @@ void exceptionHandlerWithMediaType() { assertThat(producibleMediaTypes).isNotEmpty().contains(MediaType.APPLICATION_JSON); } + @Test + void exceptionHandlerWithInvalidAcceptHeader() { + Method method = ResolvableMethod.on(ExceptionHandlerController.class).mockCall(ExceptionHandlerController::handle).method(); + this.handlerMethod = new HandlerMethod(new ExceptionHandlerController(), method); + MockServerHttpRequest httpRequest = MockServerHttpRequest.get("/test").header("Accept", "v=12").build(); + MockServerWebExchange serverWebExchange = MockServerWebExchange.builder(httpRequest).build(); + InvocableHandlerMethod invocable = this.methodResolver.getExceptionHandlerMethod( + new ResponseStatusException(HttpStatus.BAD_REQUEST, "reason"), serverWebExchange, this.handlerMethod); + + assertThat(invocable).as("No match").isNotNull(); + } + private static HandlerMethodArgumentResolver next( List resolvers, AtomicInteger index) {