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
This commit is contained in:
parent
7c65b57530
commit
e47f7ef7b5
|
@ -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
|
|||
|
||||
// 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) {
|
||||
|
|
|
@ -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
|
|||
});
|
||||
}
|
||||
|
||||
@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…
Reference in New Issue