Override StringHttpMessageConverter with UTF-8

Override the default StringHttpMessageConverter provided by the standard
Spring MVC configuration so that is uses UTF-8 instead of the aging
default of the servlet spec (that is ISO-8859-1)

Fixes gh-1800
This commit is contained in:
Stephane Nicoll
2014-11-04 13:12:19 +01:00
parent 8be97fa47d
commit cbd3c39640
3 changed files with 53 additions and 2 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.web;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.List;
@@ -28,6 +29,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@@ -47,11 +49,14 @@ import com.google.gson.Gson;
* @author David Liu
* @author Andy Wilkinson
* @author Sebastien Deleuze
* @author Stephane Nicoll
*/
@Configuration
@ConditionalOnClass(HttpMessageConverter.class)
public class HttpMessageConvertersAutoConfiguration {
private static final Charset UTF_8 = Charset.forName("UTF-8");
@Autowired(required = false)
private final List<HttpMessageConverter<?>> converters = Collections.emptyList();
@@ -118,4 +123,16 @@ public class HttpMessageConvertersAutoConfiguration {
}
@Configuration
@ConditionalOnClass(StringHttpMessageConverter.class)
protected static class StringHttpMessageConverterConfiguration {
@Bean
@ConditionalOnMissingBean
public StringHttpMessageConverter stringHttpMessageConverter() {
return new StringHttpMessageConverter(UTF_8);
}
}
}

View File

@@ -24,6 +24,7 @@ import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@@ -46,7 +47,7 @@ import static org.junit.Assert.assertTrue;
*/
public class HttpMessageConvertersAutoConfigurationTests {
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();;
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
@After
public void close() {
@@ -134,6 +135,26 @@ public class HttpMessageConvertersAutoConfigurationTests {
assertConverterBeanRegisteredWithHttpMessageConverters(GsonHttpMessageConverter.class);
}
@Test
public void defaultStringConverter() throws Exception {
this.context.register(HttpMessageConvertersAutoConfiguration.class);
this.context.refresh();
assertConverterBeanExists(StringHttpMessageConverter.class,
"stringHttpMessageConverter");
assertConverterBeanRegisteredWithHttpMessageConverters(StringHttpMessageConverter.class);
}
@Test
public void customStringConverter() throws Exception {
this.context.register(StringConverterConfig.class,
HttpMessageConvertersAutoConfiguration.class);
this.context.refresh();
assertConverterBeanExists(StringHttpMessageConverter.class,
"customStringMessageConverter");
assertConverterBeanRegisteredWithHttpMessageConverters(StringHttpMessageConverter.class);
}
private void assertConverterBeanExists(Class<?> type, String beanName) {
assertEquals(1, this.context.getBeansOfType(type).size());
List<String> beanNames = Arrays.asList(this.context.getBeanDefinitionNames());
@@ -202,4 +223,13 @@ public class HttpMessageConvertersAutoConfigurationTests {
}
}
@Configuration
protected static class StringConverterConfig {
@Bean
public StringHttpMessageConverter customStringMessageConverter() {
return new StringHttpMessageConverter();
}
}
}