Browse Source

Remove response content-type before error handling

Prior to this commit, the negotiated content-type during the request
mapping phase would be kept as the response content-type header; this
information is used when rendering the error response and prevents a new
round of content negotiation to choose the media type that fits best.

This commit removes the response content type information at the
beginning of the error handling phase.

Fixes gh-22452
pull/22522/head
Brian Clozel 7 years ago
parent
commit
e47f7ef7b5
  1. 4
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java
  2. 8
      spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingExceptionHandlingIntegrationTests.java

4
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java

@ -29,6 +29,7 @@ import org.springframework.context.ApplicationContext; @@ -29,6 +29,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.http.HttpHeaders;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.lang.Nullable;
@ -209,6 +210,9 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application @@ -209,6 +210,9 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application
// Success and error responses may use different content types
exchange.getAttributes().remove(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
if (!exchange.getResponse().isCommitted()) {
exchange.getResponse().getHeaders().remove(HttpHeaders.CONTENT_TYPE);
}
InvocableHandlerMethod invocable = this.methodResolver.getExceptionHandlerMethod(exception, handlerMethod);
if (invocable != null) {

8
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingExceptionHandlingIntegrationTests.java

@ -93,7 +93,7 @@ public class RequestMappingExceptionHandlingIntegrationTests extends AbstractReq @@ -93,7 +93,7 @@ public class RequestMappingExceptionHandlingIntegrationTests extends AbstractReq
public void exceptionFromMethodWithProducesCondition() throws Exception {
try {
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "text/csv, application/problem+json");
headers.add("Accept", "text/plain, application/problem+json");
performGet("/SPR-16318", headers, String.class).getBody();
fail();
}
@ -152,9 +152,9 @@ public class RequestMappingExceptionHandlingIntegrationTests extends AbstractReq @@ -152,9 +152,9 @@ public class RequestMappingExceptionHandlingIntegrationTests extends AbstractReq
});
}
@GetMapping(path = "/SPR-16318", produces = "text/csv")
public String handleCsv() throws Exception {
throw new Spr16318Exception();
@GetMapping(path = "/SPR-16318", produces = "text/plain")
public Mono<String> handleTextPlain() throws Exception {
return Mono.error(new Spr16318Exception());
}
@ExceptionHandler

Loading…
Cancel
Save