Skip to content

Commit

Permalink
Add Consumer methods to configure Jackson modules
Browse files Browse the repository at this point in the history
Closes gh-28633
  • Loading branch information
rstoyanchev committed Jul 13, 2022
1 parent cdd4e8c commit e50131d
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -521,7 +521,7 @@ public Jackson2ObjectMapperBuilder featuresToDisable(Object... featuresToDisable
}

/**
* Specify one or more modules to be registered with the {@link ObjectMapper}.
* Specify the modules to be registered with the {@link ObjectMapper}.
* <p>Multiple invocations are not additive, the last one defines the modules to
* register.
* <p>Note: If this is set, no finding of modules is going to happen - not by
Expand All @@ -538,15 +538,9 @@ public Jackson2ObjectMapperBuilder modules(Module... modules) {
}

/**
* Set a complete list of modules to be registered with the {@link ObjectMapper}.
* <p>Multiple invocations are not additive, the last one defines the modules to
* register.
* <p>Note: If this is set, no finding of modules is going to happen - not by
* Jackson, and not by Spring either (see {@link #findModulesViaServiceLoader}).
* As a consequence, specifying an empty list here will suppress any kind of
* module detection.
* <p>Specify either this or {@link #modulesToInstall}, not both.
* Variant of {@link #modules(Module...)} with a {@link List}.
* @see #modules(Module...)
* @see #modules(Consumer)
* @see com.fasterxml.jackson.databind.Module
*/
public Jackson2ObjectMapperBuilder modules(List<Module> modules) {
Expand All @@ -556,6 +550,22 @@ public Jackson2ObjectMapperBuilder modules(List<Module> modules) {
return this;
}

/**
* Variant of {@link #modules(Module...)} with a {@link Consumer} for full
* control over the underlying list of modules.
* @since 6.0
* @see #modules(Module...)
* @see #modules(List)
* @see com.fasterxml.jackson.databind.Module
*/
public Jackson2ObjectMapperBuilder modules(Consumer<List<Module>> consumer) {
this.modules = (this.modules != null ? this.modules : new ArrayList<>());
this.findModulesViaServiceLoader = false;
this.findWellKnownModules = false;
consumer.accept(this.modules);
return this;
}

/**
* Specify one or more modules to be registered with the {@link ObjectMapper}.
* <p>Multiple invocations are not additive, the last one defines the modules
Expand All @@ -566,6 +576,7 @@ public Jackson2ObjectMapperBuilder modules(List<Module> modules) {
* allowing to eventually override their configuration.
* <p>Specify either this or {@link #modules(Module...)}, not both.
* @since 4.1.5
* @see #modulesToInstall(Consumer)
* @see #modulesToInstall(Class...)
* @see com.fasterxml.jackson.databind.Module
*/
Expand All @@ -575,6 +586,21 @@ public Jackson2ObjectMapperBuilder modulesToInstall(Module... modules) {
return this;
}

/**
* Variant of {@link #modulesToInstall(Module...)} with a {@link Consumer}
* for full control over the underlying list of modules.
* @since 6.0
* @see #modulesToInstall(Module...)
* @see #modulesToInstall(Class...)
* @see com.fasterxml.jackson.databind.Module
*/
public Jackson2ObjectMapperBuilder modulesToInstall(Consumer<List<Module>> consumer) {
this.modules = (this.modules != null ? this.modules : new ArrayList<>());
this.findWellKnownModules = true;
consumer.accept(this.modules);
return this;
}

/**
* Specify one or more modules by class to be registered with
* the {@link ObjectMapper}.
Expand All @@ -586,6 +612,7 @@ public Jackson2ObjectMapperBuilder modulesToInstall(Module... modules) {
* allowing to eventually override their configuration.
* <p>Specify either this or {@link #modules(Module...)}, not both.
* @see #modulesToInstall(Module...)
* @see #modulesToInstall(Consumer)
* @see com.fasterxml.jackson.databind.Module
*/
@SafeVarargs
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -241,6 +241,16 @@ void modules() {
assertThat(serializers.findSerializer(null, SimpleType.construct(Integer.class), null)).isSameAs(serializer1);
}

@Test
void modulesWithConsumer() {
NumberSerializer serializer1 = new NumberSerializer(Integer.class);
SimpleModule module = new SimpleModule();
module.addSerializer(Integer.class, serializer1);
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modules(list -> list.add(module) ).build();
Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next();
assertThat(serializers.findSerializer(null, SimpleType.construct(Integer.class), null)).isSameAs(serializer1);
}

@Test
void modulesToInstallByClass() {
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
Expand All @@ -259,6 +269,15 @@ void modulesToInstallByInstance() {
assertThat(serializers.findSerializer(null, SimpleType.construct(Integer.class), null).getClass()).isSameAs(CustomIntegerSerializer.class);
}

@Test
void modulesToInstallWithConsumer() {
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
.modulesToInstall(list -> list.add(new CustomIntegerModule()))
.build();
Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next();
assertThat(serializers.findSerializer(null, SimpleType.construct(Integer.class), null).getClass()).isSameAs(CustomIntegerSerializer.class);
}

@Test
void wellKnownModules() throws JsonProcessingException, UnsupportedEncodingException {
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
Expand Down

0 comments on commit e50131d

Please sign in to comment.