I'm building a Spring MVC service using Spring Boot and want to be able to return strings as plain text encoded in UTF-8. Following this description, I thought the only thing necessary should be to add the bean method
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8"))));
return converter;
}
But the root
method in
@Controller
public class RootController {
@RequestMapping(value="/"/*, produces="text/plain;charset=UTF-8"*/)
@ResponseBody
public String root() {
return "æøå";
}
}
responds the string æøå
in ISO-8859-1 instead of UTF-8, unless I uncomment the produces
part, in which case it actually returns UTF-8. The message converter doesn't seems to have any effect here.
Following this approach I confirm that the bean has actually been registered. Besides this bean, I also register an EmbeddedServletContainerFactory
and CharacterEncodingFilter
as described in another question, although I don't think that's relevant here.
Can someone explain what the registered HttpMessageConverter
actually does, and how to make @ResponseBody
-annotated controller methods return UTF-8 without having to provide produces
every time?
Edit
As discussed in the comments, for the accepted answer to work, I had to upgrade the version of Spring Boot from 0.5.0.M6
to 0.5.0.BUILD-SNAPSHOT
and, to prevent outputting a junk header, call converter.setWriteAcceptCharset(false)
on the StringHttpMessageConverter
.