web-dev-qa-db-fra.com

Comment faire une démarrage à ressort par défaut à l'application / JSON; CHRSTE = UTF-8 au lieu d'application / JSON; Charset = ISO-8859-1

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?

6
pdewilde

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
1
Bishal Jaiswal

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:

Plus d'exemples avec MappingJackson2HttpMessageConverter:

0
oshatrk