Je mette la mise à jour du démarrage de 1,6 à 2.1.3 et, tandis que avant que les réponses n'avaient eu de contenu Type application/json;charset=UTF-8
, maintenant, je reçois une brict de l'ISO-8859-1.
J'aimerais avoir UTF 8.
Mon contrôleur ressemble à ceci:
@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);
}
Je peux l'obtenir pour revenir utf-8 si j'inclus produces= MediaType.APPLICATION_JSON_UTF8_VALUE
dans mon @RequestMapping
Mais je voudrais seulement avoir à définir cela une fois, plutôt que pour chaque API unique.
J'ai aussi essayé d'ajouter
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
}
à mon webmvcconfigurier comme suggéré ici: https://stackoverflow.com/a/25275291/2855921 Mais cela a cassé mon API de disponibilité qui consomme du type de contenu uni/texte.
Je suis également assuré que ma demande était UTF-8, il ne s'agit pas simplement de refléter le format que j'ai donné.
Des idées sur la manière dont je peux définir le Charset pour être UTF-8 pour l'ensemble du projet?
Ajoutez les propriétés ci-dessous au fichier Application.Properties Fichier:
# 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
Si vous utilisez le mappeur d'objet par défaut (Jackson
), le codage peut être forcé avec cette configuration simple:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
return jsonConverter;
}
Ici, le constructeur MappingJackson2HttpMessageConverter()
constructeur utilise la classe publique Jackson2ObjectMapperBuilder
Pour définir les paramètres par défaut pour un objet mapper.
Pour un autre mapper d'objet (Gson
ou Jsonb
), vous pouvez consulter AllEncompassingFormHttpMessageConverter()
Constructeur.
Remarque également MediaType.APPLICATION_JSON_UTF8
A été obsolète en faveur de MediaType.APPLICATION_JSON
Depuis le printemps 5.2. Donc, dans les tests, je préfère utiliser contentTypeCompatibleWith(...)
au lieu de 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();
Liens:
APPLICATION_JSON_UTF8
A été remplacé par APPLICATION_JSON
Dans MappingJackson2HttpMessageConverter
- https://github.com/spring-projects/spring-framework/spring-framework/spring-framework/spring- COMMITE/C38542739734C15E84A28ECC5F575127F25D310A"Content-Type: application/json"
Support - https://bugs.chromium.org/p/chromium/issues/detail?id=438464"charset"
Pour "Content-Type: application/json"
Dans rfc7159 - https://tools.ietf.org/html/rfc7159#sectionn-11Plus d'exemples avec MappingJackson2HttpMessageConverter
: