web-dev-qa-db-fra.com

Comment personnaliser Jackson dans Spring Boot 1.4

Je n'ai pas pu trouver d'exemples sur la façon d'utiliser Jackson2ObjectMapperBuilderCustomizer.Java dans Spring Boot 1.4 pour personnaliser les fonctionnalités de Jackson.

Le doco pour personnaliser Jackson au démarrage 1.4 - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-

Ma configuration fonctionne, même si je ne suis pas sûr que ce soit la bonne façon de personnaliser le mappeur d'objets en utilisant Jackson2ObjectMapperBuilderCustomizer.Java

@Configuration
public class JacksonAutoConfiguration {

    @Autowired
    private Environment env;

    @Bean
    public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(
        List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
        Jackson2ObjectMapperBuilder builder = configureObjectMapper();
        customize(builder, customizers);
        return builder;
    }

    private void customize(Jackson2ObjectMapperBuilder builder,
                           List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
        for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {
            customizer.customize(builder);
        }
    }

    private Jackson2ObjectMapperBuilder configureObjectMapper() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        List<String> activeProfiles = asList(env.getActiveProfiles());
        if (activeProfiles.contains(SPRING_PROFILE_DEVELOPMENT)) {
            builder.featuresToEnable(SerializationFeature.INDENT_OUTPUT);
        }
        return builder;
    }
}

Pour fournir un certain contexte, cette classe se trouve dans mon propre projet de démarrage de printemps pour REST services qui configurent simplement automatiquement un certain nombre de choses, comme ControllerAdvice et certaines fonctionnalités triviales comme ci-dessus.

Mon objectif est donc d'étendre la configuration de Jackson plutôt que de remplacer toute configuration fournie par le démarrage ou d'autres packages.

20
Reece

Pour personnaliser le Jackson ObjectMapper qui est déjà préconfiguré par Spring Boot, j'ai pu le faire (l'exemple ici est d'ajouter un désérialiseur personnalisé).

Classe de configuration:

@SpringBootConfiguration
public class Application {

    @Autowired
    private BigDecimalDeserializer bigDecimalDeserializer;

    ...

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer addCustomBigDecimalDeserialization() {
        return new Jackson2ObjectMapperBuilderCustomizer() {

            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
                jacksonObjectMapperBuilder.deserializerByType(BigDecimal.class, bigDecimalDeserializer);
            }

        };
    }

    ...

}

Et mon désérialiseur personnalisé, pour montrer comment il est récupéré au printemps:

@Component
public class BigDecimalDeserializer extends StdDeserializer<BigDecimal> {

    public BigDecimalDeserializer() {
        super(BigDecimal.class);
    }

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        ...
    }

    ...

}
30
Mark

Cela dépend de ce que vous essayez de faire.

Si vous souhaitez effectuer des personnalisations en plus de celles qui sont effectuées par défaut, vous devez créer votre propre Jackson2ObjectMapperBuilderCustomizer implémentation et l'exposer en tant que bean. Ce que vous avez actuellement est une version plus complexe de cela. Plutôt que de faire injecter les personnalisateurs puis de les appeler vous-même, vous pouvez simplement créer votre propre bean de personnalisation et Boot l'appellera pour vous.

Si vous souhaitez prendre le contrôle complet et désactiver toutes les personnalisations de Boot, créez un Jackson2ObjectMapperBuilder ou ObjectMapper bean et configurez-le selon vos besoins. L'approche du générateur est préférée car ce générateur est ensuite également utilisé pour configurer les ObjectMappers créés par d'autres composants tels que Spring Data REST.

En regardant votre code et en prenant du recul, vous pouvez configurer les choses beaucoup plus simplement en utilisant un fichier de configuration spécifique au profil (quelque chose comme application-dev.properties) pour activer le retrait de la sortie de Jackson. Vous pouvez en savoir plus à ce sujet ici .

7
Andy Wilkinson

créez simplement un bean ObjectMapper:

@Bean
ObjectMapper objectMapper() {
    return Jackson2ObjectMapperBuilder
            .json()
            .featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION)
            .build();
}
1
Ulises