diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java index 09c6e0e711c..e990fcd774b 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java @@ -43,6 +43,7 @@ import org.springframework.util.Assert; * * @author Arjen Poutsma * @author Juergen Hoeller + * @author Sebastien Deleuze * @since 3.0 */ public abstract class AbstractHttpMessageConverter implements HttpMessageConverter { @@ -246,8 +247,11 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv contentTypeToUse = (mediaType != null ? mediaType : contentTypeToUse); } if (contentTypeToUse != null) { - if (contentTypeToUse.getCharset() == null && this.defaultCharset != null) { - contentTypeToUse = new MediaType(contentTypeToUse, this.defaultCharset); + if (contentTypeToUse.getCharset() == null) { + Charset defaultCharset = getDefaultCharset(); + if (defaultCharset != null) { + contentTypeToUse = new MediaType(contentTypeToUse, defaultCharset); + } } headers.setContentType(contentTypeToUse); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java index 87c003d7a58..12c95e141be 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -32,15 +32,19 @@ import org.springframework.util.StreamUtils; * overridden by setting the {@link #setSupportedMediaTypes supportedMediaTypes} property. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ public class ByteArrayHttpMessageConverter extends AbstractHttpMessageConverter { - /** Creates a new instance of the {@code ByteArrayHttpMessageConverter}. */ + /** + * Create a new instance of the {@code ByteArrayHttpMessageConverter}. + */ public ByteArrayHttpMessageConverter() { super(new MediaType("application", "octet-stream"), MediaType.ALL); } + @Override public boolean supports(Class clazz) { return byte[].class == clazz; diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index 3a5584a9485..643a8713f0e 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -82,6 +82,7 @@ import org.springframework.util.StringUtils; * * @author Arjen Poutsma * @author Rossen Stoyanchev + * @author Juergen Hoeller * @since 3.0 * @see MultiValueMap */ @@ -90,14 +91,14 @@ public class FormHttpMessageConverter implements HttpMessageConverter supportedMediaTypes = new ArrayList(); private List> partConverters = new ArrayList>(); + private Charset charset = DEFAULT_CHARSET; + + private Charset multipartCharset; + public FormHttpMessageConverter() { this.supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED); @@ -108,30 +109,10 @@ public class FormHttpMessageConverter implements HttpMessageConverterBy default this is set to "UTF-8". - */ - public void setCharset(Charset charset) { - this.charset = charset; + applyDefaultCharset(); } - /** - * Set the character set to use when writing multipart data to encode file - * names. Encoding is based on the encoded-word syntax defined in RFC 2047 - * and relies on {@code MimeUtility} from "javax.mail". - *

If not set file names will be encoded as US-ASCII. - * @param multipartCharset the charset to use - * @since 4.1.1 - * @see Encoded-Word - */ - public void setMultipartCharset(Charset multipartCharset) { - this.multipartCharset = multipartCharset; - } /** * Set the list of {@link MediaType} objects supported by this converter. @@ -163,6 +144,49 @@ public class FormHttpMessageConverter implements HttpMessageConverterBy default this is set to "UTF-8". As of 4.3, it will also be used as + * the default charset for the conversion of text bodies in a multipart request. + * In contrast to this, {@link #setMultipartCharset} only affects the encoding of + * file names in a multipart request according to the encoded-word syntax. + */ + public void setCharset(Charset charset) { + if (charset != this.charset) { + this.charset = (charset != null ? charset : DEFAULT_CHARSET); + applyDefaultCharset(); + } + } + + /** + * Apply the configured charset as a default to registered part converters. + */ + private void applyDefaultCharset() { + for (HttpMessageConverter candidate : this.partConverters) { + if (candidate instanceof AbstractHttpMessageConverter) { + AbstractHttpMessageConverter converter = (AbstractHttpMessageConverter) candidate; + // Only override default charset if the converter operates with a charset to begin with... + if (converter.getDefaultCharset() != null) { + converter.setDefaultCharset(this.charset); + } + } + } + } + + /** + * Set the character set to use when writing multipart data to encode file + * names. Encoding is based on the encoded-word syntax defined in RFC 2047 + * and relies on {@code MimeUtility} from "javax.mail". + *

If not set file names will be encoded as US-ASCII. + * @param multipartCharset the charset to use + * @since 4.1.1 + * @see Encoded-Word + */ + public void setMultipartCharset(Charset multipartCharset) { + this.multipartCharset = multipartCharset; + } + @Override public boolean canRead(Class clazz, MediaType mediaType) { @@ -255,7 +279,7 @@ public class FormHttpMessageConverter implements HttpMessageConverter - * By default, this converter supports the media type {@code text/plain} only. + * + *

By default, this converter supports the media type {@code text/plain} only. * This can be overridden by setting the * {@link #setSupportedMediaTypes supportedMediaTypes} property. * Example of usage: @@ -49,17 +49,15 @@ import org.springframework.util.Assert; */ public class ObjectToStringHttpMessageConverter extends AbstractHttpMessageConverter { - private ConversionService conversionService; + private final ConversionService conversionService; - private StringHttpMessageConverter stringHttpMessageConverter; + private final StringHttpMessageConverter stringHttpMessageConverter; /** * A constructor accepting a {@code ConversionService} to use to convert the - * (String) message body to/from the target class type. This constructor - * uses {@link StringHttpMessageConverter#DEFAULT_CHARSET} as the default - * charset. - * + * (String) message body to/from the target class type. This constructor uses + * {@link StringHttpMessageConverter#DEFAULT_CHARSET} as the default charset. * @param conversionService the conversion service */ public ObjectToStringHttpMessageConverter(ConversionService conversionService) { @@ -67,9 +65,7 @@ public class ObjectToStringHttpMessageConverter extends AbstractHttpMessageConve } /** - * A constructor accepting a {@code ConversionService} as well as a default - * charset. - * + * A constructor accepting a {@code ConversionService} as well as a default charset. * @param conversionService the conversion service * @param defaultCharset the default charset */ @@ -81,6 +77,7 @@ public class ObjectToStringHttpMessageConverter extends AbstractHttpMessageConve this.stringHttpMessageConverter = new StringHttpMessageConverter(defaultCharset); } + /** * Indicates whether the {@code Accept-Charset} should be written to any outgoing request. *

Default is {@code true}. @@ -89,6 +86,7 @@ public class ObjectToStringHttpMessageConverter extends AbstractHttpMessageConve this.stringHttpMessageConverter.setWriteAcceptCharset(writeAcceptCharset); } + @Override public boolean canRead(Class clazz, MediaType mediaType) { return this.conversionService.canConvert(String.class, clazz) && canRead(mediaType); @@ -113,8 +111,8 @@ public class ObjectToStringHttpMessageConverter extends AbstractHttpMessageConve @Override protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException { - String s = this.conversionService.convert(obj, String.class); - this.stringHttpMessageConverter.writeInternal(s, outputMessage); + String value = this.conversionService.convert(obj, String.class); + this.stringHttpMessageConverter.writeInternal(value, outputMessage); } @Override diff --git a/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java index d1d23821c42..dc15005483c 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -35,6 +35,7 @@ import org.springframework.util.StreamUtils; * by setting the {@link #setSupportedMediaTypes supportedMediaTypes} property. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ public class StringHttpMessageConverter extends AbstractHttpMessageConverter { @@ -122,7 +123,7 @@ public class StringHttpMessageConverter extends AbstractHttpMessageConverter