Skip to content

Commit ce4f6e9

Browse files
authored
create JsonMapper.Builder as prototype bean (#12239)
* create JsonMapper.Builder as prototype bean This could allow to register for example filter providers in Jackson 3: ``` package io.micronaut.serde.tck.jackson.databind; import io.micronaut.context.event.BeanCreatedEvent; import io.micronaut.context.event.BeanCreatedEventListener; import org.jspecify.annotations.NonNull; import jakarta.inject.Singleton; import tools.jackson.databind.json.JsonMapper; import tools.jackson.databind.ser.std.SimpleFilterProvider; @singleton public class JsonsMapperBeanCreatedEventListener implements BeanCreatedEventListener<JsonMapper.Builder> { private final DatabindPredicateFilter predicateFilter; public JsonsMapperBeanCreatedEventListener(DatabindPredicateFilter predicateFilter) { this.predicateFilter = predicateFilter; } @OverRide public JsonMapper.Builder onCreated(@nonnull BeanCreatedEvent<JsonMapper.Builder> event) { JsonMapper.Builder builder = event.getBean(); SimpleFilterProvider filterProvider = new SimpleFilterProvider(); filterProvider.addFilter("ignore-value", predicateFilter); builder.filterProvider(filterProvider); return builder; } } ``` * JsonMapper.Builder * fix checkstyleMain * annotate also builder with @BootstrapContextCompatible
1 parent 6093fb2 commit ce4f6e9

File tree

4 files changed

+24
-11
lines changed

4 files changed

+24
-11
lines changed

jackson-databind/src/main/java/io/micronaut/jackson/ObjectMapperFactory.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.micronaut.context.annotation.BootstrapContextCompatible;
2121
import io.micronaut.context.annotation.Factory;
2222
import io.micronaut.context.annotation.Primary;
23+
import io.micronaut.context.annotation.Prototype;
2324
import io.micronaut.context.annotation.Requires;
2425
import io.micronaut.context.annotation.Type;
2526
import io.micronaut.core.convert.ConversionService;
@@ -29,6 +30,7 @@
2930
import jakarta.inject.Inject;
3031
import jakarta.inject.Named;
3132
import jakarta.inject.Singleton;
33+
import org.jspecify.annotations.NonNull;
3234
import org.jspecify.annotations.Nullable;
3335
import tools.jackson.core.JsonParser;
3436
import tools.jackson.core.json.JsonFactory;
@@ -38,7 +40,6 @@
3840
import tools.jackson.databind.DeserializationFeature;
3941
import tools.jackson.databind.JacksonModule;
4042
import tools.jackson.databind.KeyDeserializer;
41-
import tools.jackson.databind.ObjectMapper;
4243
import tools.jackson.databind.PropertyNamingStrategy;
4344
import tools.jackson.databind.ValueDeserializer;
4445
import tools.jackson.databind.ValueSerializer;
@@ -130,18 +131,30 @@ public void setDeserializers(ValueDeserializer... deserializers) {
130131
}
131132

132133
/**
133-
* Builds the core Jackson {@link ObjectMapper} from the optional configuration and {@link JsonFactory}.
134+
* Builds the core Jackson {@link JsonMapper} from a {@link JsonMapper.Builder}.
134135
*
135-
* @param jacksonConfiguration The configuration
136-
* @param jsonFactory The JSON factory
137-
* @return The {@link ObjectMapper}
136+
* @param jsonMapperBuilder JsonMapper Builder
137+
* @return The {@link JsonMapper}
138138
*/
139139
@Singleton
140140
@Primary
141141
@Named("json")
142142
@BootstrapContextCompatible
143-
public JsonMapper objectMapper(@Nullable JacksonConfiguration jacksonConfiguration,
144-
@Nullable JsonFactory jsonFactory) {
143+
public JsonMapper jsonMapper(JsonMapper.@NonNull Builder jsonMapperBuilder) {
144+
return jsonMapperBuilder.build();
145+
}
146+
147+
/**
148+
* Builds the core Jackson {@link JsonMapper.Builder} from the optional configuration and {@link JsonFactory}.
149+
*
150+
* @param jacksonConfiguration The configuration
151+
* @param jsonFactory The JSON factory
152+
* @return The {@link JsonMapper.Builder}
153+
*/
154+
@BootstrapContextCompatible
155+
@Prototype
156+
public JsonMapper.Builder jsonMapperBuilder(@Nullable JacksonConfiguration jacksonConfiguration,
157+
@Nullable JsonFactory jsonFactory) {
145158
JsonMapper.Builder builder = jsonFactory != null ? JsonMapper.builder(jsonFactory) : JsonMapper.builder();
146159

147160
final boolean hasConfiguration = jacksonConfiguration != null;
@@ -261,6 +274,6 @@ public String deserialize(JsonParser p, DeserializationContext ctxt) {
261274
jacksonConfiguration.getSerializationFeatures().forEach(builder::configure);
262275
}
263276

264-
return builder.build();
277+
return builder;
265278
}
266279
}

jackson-databind/src/main/java/io/micronaut/jackson/databind/JacksonDatabindMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private static ObjectMapper createDefaultMapper() {
132132
var objectMapperFactory = new ObjectMapperFactory();
133133
objectMapperFactory.setDeserializers(new JsonNodeDeserializer());
134134
objectMapperFactory.setSerializers(new JsonNodeSerializer());
135-
return objectMapperFactory.objectMapper(null, null);
135+
return objectMapperFactory.jsonMapperBuilder(null, null).build();
136136
}
137137

138138
@Internal

jackson-databind/src/test/groovy/io/micronaut/jackson/serialize/JacksonObjectSerializerSpec.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class JacksonObjectSerializerSpec extends Specification {
99

1010
@Issue("https://github.com/micronaut-projects/micronaut-core/issues/2282")
1111
void "test empty optional is returned"() {
12-
ObjectMapper objectMapper = new ObjectMapperFactory().objectMapper(null, null)
12+
ObjectMapper objectMapper = new ObjectMapperFactory().jsonMapperBuilder(null, null).build()
1313

1414
when:
1515
Optional<Object> optional = new JacksonObjectSerializer(objectMapper).deserialize("null".bytes)

jackson-databind/src/test/groovy/io/micronaut/json/JsonObjectSerializerSpec.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class JsonObjectSerializerSpec extends Specification {
1010

1111
@Issue("https://github.com/micronaut-projects/micronaut-core/issues/2282")
1212
void "test empty optional is returned"() {
13-
ObjectMapper objectMapper = new ObjectMapperFactory().objectMapper(null, null)
13+
ObjectMapper objectMapper = new ObjectMapperFactory().jsonMapperBuilder(null, null).build()
1414

1515
when:
1616
Optional<Object> optional = new JsonObjectSerializer(new JacksonDatabindMapper(objectMapper)).deserialize("null".bytes)

0 commit comments

Comments
 (0)