Reputation: 306
I am updating spring-boot from 1.3.6 to 2.1.3 and while before responses had content type application/json;charset=UTF-8
, now I am getting a charset of iso-8859-1.
I would like to have utf 8.
My controller looks like this:
@Controller
public class MyController {
@RequestMapping(value={"/myService/{serviceId}"}, method=RequestMethod.POST, consumes="application/json")
public ResponseEntity<Void> handlePostServiceId(final InputStream requestInputStream,
@PathVariable String serviceId,
final HttpServletRequest servletRequest,) {
<$businessLogic>
return new ResponseEntity<>(new HttpHeaders(), HttpStatus.ACCEPTED);
}
I can get it to return utf-8 if I include produces= MediaType.APPLICATION_JSON_UTF8_VALUE
in my @RequestMapping
but I would like to only have to set that once, rather than for every single API.
I also tried adding
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
}
to my WebMvcConfigurer as suggested here: https://stackoverflow.com/a/25275291/2855921 but that broke my availability api which consumes plain/text content type.
I also ensured that my request was UTF-8, so it is not just mirroring back the format I gave.
Any ideas on how I can set the charset to be UTF-8 for the entire project?
Upvotes: 15
Views: 31860
Reputation: 1873
Add the below properties to the application.properties file:
For Spring Boot 1.x
# Charset of HTTP requests and responses. Added to the "Content-Type"
# header if not set explicitly.
spring.http.encoding.charset=UTF-8
# Enable http encoding support.
spring.http.encoding.enabled=true
# Force the encoding to the configured charset on HTTP requests and responses.
spring.http.encoding.force=true
For Spring Boot 2.x
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force-response=true
Upvotes: 22
Reputation: 529
If you're using default object mapper (Jackson
) then the encoding can be forced with this simple configuration:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
return jsonConverter;
}
Here the MappingJackson2HttpMessageConverter()
constructor uses public Jackson2ObjectMapperBuilder
class to set default parameters for an object mapper.
For another object mapper (Gson
or Jsonb
) you can look into AllEncompassingFormHttpMessageConverter()
constructor.
Note also MediaType.APPLICATION_JSON_UTF8
was deprecated in favor of MediaType.APPLICATION_JSON
since Spring 5.2.
So in tests I prefer to use contentTypeCompatibleWith(...)
instead of contentType(..._UTF8)
:
MvcResult result = mockMvc.perform(get("/api/resource"))
.andDo(print())
.andExpect(status().isOk())
// .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andReturn();
Links:
APPLICATION_JSON_UTF8
was replaced by APPLICATION_JSON
in MappingJackson2HttpMessageConverter
— https://github.com/spring-projects/spring-framework/commit/c38542739734c15e84a28ecc5f575127f25d310a"Content-Type: application/json"
support —https://bugs.chromium.org/p/chromium/issues/detail?id=438464"charset"
for "Content-Type: application/json"
in RFC7159 — https://www.rfc-editor.org/rfc/rfc7159#section-11More examples with MappingJackson2HttpMessageConverter
:
Upvotes: 8