From c135549a4e75950228b3414df492e6776fa95ece Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 27 Sep 2022 11:37:25 +0100 Subject: [PATCH] Conditional initialization of messageConverters Closes gh-27854 --- .../ExceptionHandlerExceptionResolver.java | 41 ++++++++++--------- .../RequestMappingHandlerAdapter.java | 39 ++++++++++-------- 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index 50c29b00a57..4102e9ece2b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -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> messageConverters; + private List> 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 *

These converters are used to convert from and to HTTP requests and responses. */ public void setMessageConverters(List> 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 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; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index c3422c5a146..85722e1ce52 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -158,7 +158,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager(); - private List> messageConverters; + private List> messageConverters = new ArrayList<>(); private final List requestResponseBodyAdvice = new ArrayList<>(); @@ -200,22 +200,6 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter private final Map> 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> 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 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;