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.
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 {
...
}
...
}
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 .
créez simplement un bean ObjectMapper
:
@Bean
ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder
.json()
.featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION)
.build();
}