web-dev-qa-db-fra.com

Jackson ignore spring.jackson.properties dans mon application de démarrage de printemps

Jackson ignore spring.jackson.property-naming-strategy = SNAKE_CASE . J'utilise springBootVersion 1.4.2.RELEASE. Dans mon fichier application.properties, j'ai ajouté 

spring.jackson.property-naming-strategy = SNAKE_CASE

Mais Jackson n'honore pas cette propriété et ma réponse REST est toujours camelCase. Fait intéressant, cette annotation fonctionne très bien 

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)

Avec cette annotation, je reçois une réponse snake_case. Mais je ne veux pas annoter chaque classe de réponse, c'est un peu gênant.

Modifier

J'ai aussi essayé d'utiliser un nom de classe pleinement qualifié,

spring.jackson.property-naming-strategy = com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy

cela n'a pas fonctionné non plus

13
so-random-dude

J'ai eu l'annotation @EnableWebMvc dans l'une des classes (ExceptionHandler) dans mon application (face-Palm!). 

Mais, selon ce numéro

Si vous avez l'annotation @EnableWebMvc, cela désactive le configuration automatique de Spring MVC, y compris la configuration de son convertisseurs de messages pour personnaliser la sérialisation de Jackson.

C'est le comportement attendu lorsque vous utilisez @EnableWebMvc en tant que, ce faisant, vous dites à Spring Boot que vous souhaitez prendre le contrôle de Spring La configuration de MVC. Cela inclut la configuration de son message HTTP convertisseurs pour (dé) sérialiser JSON de la manière qui vous convient.

Si vous souhaitez remplacer la configuration de Jackson, vous pouvez utiliser les propriétés spring.jackson. * ou, si vous souhaitez davantage de contrôle, déclarez votre propre bean Jackson2ObjectMapperBuilder.

Une fois que j'ai supprimé l'annotation @EnableWebMvc, cette propriété fonctionne comme prévu.

13
so-random-dude

Selon le doc

/**
 * One of the constants on Jackson's PropertyNamingStrategy
 * (CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES). Can also be a fully-qualified class
 * name of a PropertyNamingStrategy subclass.
 */
private String propertyNamingStrategy;

Vous pouvez le configurer dans "application.properties" avec ceci:

spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy
2
Liping Huang

La classe MappingJackson2HttpMessageConverter utilise l'instance par défaut créée par la méthode Jackson2ObjectMapperBuilder.json () . Afin d'utiliser ObjectMapper de l'application conext, vous pouvez enregistrer un WebMvcConfigurerAdapter personnalisé. 

@Configuration
public class WebMvcDefaultObjectMapperConfigurerAdapter extends WebMvcConfigurerAdapter {

    private ObjectMapper mapper;

    @Autowired
    public WebMvcDefaultObjectMapperConfigurerAdapter(ObjectMapper mapper) {
        // default mapper configured with spring.*
        this.mapper = mapper;
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> httpConverter : converters) {
            if (httpConverter instanceof MappingJackson2HttpMessageConverter) {
                // register the configured object mapper to HttpMessageconter
                ((MappingJackson2HttpMessageConverter) httpConverter).setObjectMapper(mapper);
            }
        }
    }
}
1
skadya