Conditional initialization of messageConverters

Closes gh-27854
This commit is contained in:
rstoyanchev 2022-09-27 11:37:25 +01:00
parent f80fbe30cc
commit c135549a4e
2 changed files with 43 additions and 37 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -97,7 +97,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce
@Nullable
private HandlerMethodReturnValueHandlerComposite returnValueHandlers;
private List<HttpMessageConverter<?>> messageConverters;
private List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager();
@ -113,22 +113,6 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce
new LinkedHashMap<>();
public ExceptionHandlerExceptionResolver() {
this.messageConverters = new ArrayList<>();
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
if(!shouldIgnoreXml) {
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
}
/**
* Provide resolvers for custom argument types. Custom resolvers are ordered
* after built-in ones. To override the built-in support for argument
@ -214,7 +198,8 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce
* <p>These converters are used to convert from and to HTTP requests and responses.
*/
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters = messageConverters;
this.messageConverters.clear();
this.messageConverters.addAll(messageConverters);
}
/**
@ -266,6 +251,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce
public void afterPropertiesSet() {
// Do this first, it may add ResponseBodyAdvice beans
initExceptionHandlerAdviceCache();
initMessageConverters();
if (this.argumentResolvers == null) {
List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers();
@ -277,6 +263,23 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce
}
}
private void initMessageConverters() {
if (!this.messageConverters.isEmpty()) {
return;
}
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
if (!shouldIgnoreXml) {
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
}
private void initExceptionHandlerAdviceCache() {
if (getApplicationContext() == null) {
return;

View File

@ -158,7 +158,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager();
private List<HttpMessageConverter<?>> messageConverters;
private List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
private final List<Object> requestResponseBodyAdvice = new ArrayList<>();
@ -200,22 +200,6 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
private final Map<ControllerAdviceBean, Set<Method>> modelAttributeAdviceCache = new LinkedHashMap<>();
public RequestMappingHandlerAdapter() {
this.messageConverters = new ArrayList<>(4);
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
if (!shouldIgnoreXml) {
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
}
/**
* Provide resolvers for custom argument types. Custom resolvers are ordered
* after built-in ones. To override the built-in support for argument
@ -358,7 +342,8 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
* request and response.
*/
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters = messageConverters;
this.messageConverters.clear();
this.messageConverters.addAll(messageConverters);
}
/**
@ -569,6 +554,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
public void afterPropertiesSet() {
// Do this first, it may add ResponseBody advice beans
initControllerAdviceCache();
initMessageConverters();
if (this.argumentResolvers == null) {
List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers();
@ -584,6 +570,23 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
}
}
private void initMessageConverters() {
if (!this.messageConverters.isEmpty()) {
return;
}
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
if (!shouldIgnoreXml) {
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
}
private void initControllerAdviceCache() {
if (getApplicationContext() == null) {
return;