From 7746c9456c96ecbffb6418b28958bbf2b7fd3360 Mon Sep 17 00:00:00 2001 From: Graeme Rocher Date: Mon, 14 Oct 2024 12:22:08 +0200 Subject: [PATCH] Allow access to serde registry from ObjectMapper (#948) currently if you create an ObjectMapper there is no way to access the associated SerdeRegistry. Some implementations (like in Micronaut Data) that create the default mapper need access to this. This simple PR adds a getter to retrieve it. --- .../src/main/java/io/micronaut/serde/ObjectMapper.java | 9 +++++++++ .../src/main/java/io/micronaut/serde/ObjectMappers.java | 5 +++++ .../java/io/micronaut/serde/bson/AbstractBsonMapper.java | 5 +++++ .../io/micronaut/serde/jackson/JacksonJsonMapper.java | 5 +++++ .../io/micronaut/serde/json/stream/JsonStreamMapper.java | 5 +++++ .../jdbc/json/AbstractOracleJdbcJsonObjectMapper.java | 5 +++++ 6 files changed, 34 insertions(+) diff --git a/serde-api/src/main/java/io/micronaut/serde/ObjectMapper.java b/serde-api/src/main/java/io/micronaut/serde/ObjectMapper.java index c987c42b4..e29b752f9 100644 --- a/serde-api/src/main/java/io/micronaut/serde/ObjectMapper.java +++ b/serde-api/src/main/java/io/micronaut/serde/ObjectMapper.java @@ -67,6 +67,15 @@ default ObjectMapper cloneWithConfiguration( return this; } + /** + * Returns the {@link SerdeRegistry} used by this object mapper, if possible. + * + * @return The serde registry + */ + default @NonNull SerdeRegistry getSerdeRegistry() { + throw new UnsupportedOperationException("No accessible SerdeRegistry"); + } + /** * Get the default ObjectMapper instance. * diff --git a/serde-api/src/main/java/io/micronaut/serde/ObjectMappers.java b/serde-api/src/main/java/io/micronaut/serde/ObjectMappers.java index 9fe47690a..f180ace7a 100644 --- a/serde-api/src/main/java/io/micronaut/serde/ObjectMappers.java +++ b/serde-api/src/main/java/io/micronaut/serde/ObjectMappers.java @@ -102,6 +102,11 @@ protected Set getIncludedPackages() { ObjectMapper objectMapper = context.getBean(ObjectMapper.class); return new ObjectMapper.CloseableObjectMapper() { + @Override + public SerdeRegistry getSerdeRegistry() { + return objectMapper.getSerdeRegistry(); + } + @Override public T readValueFromTree(JsonNode tree, Argument type) throws IOException { return objectMapper.readValueFromTree(tree, type); diff --git a/serde-bson/src/main/java/io/micronaut/serde/bson/AbstractBsonMapper.java b/serde-bson/src/main/java/io/micronaut/serde/bson/AbstractBsonMapper.java index 313285a0a..dd819bde7 100644 --- a/serde-bson/src/main/java/io/micronaut/serde/bson/AbstractBsonMapper.java +++ b/serde-bson/src/main/java/io/micronaut/serde/bson/AbstractBsonMapper.java @@ -68,6 +68,11 @@ protected AbstractBsonMapper(SerdeRegistry registry, SerdeConfiguration serdeCon this.decoderContext = registry.newDecoderContext(view); } + @Override + public SerdeRegistry getSerdeRegistry() { + return this.registry; + } + protected abstract BsonReader createBsonReader(ByteBuffer byteBuffer); protected abstract AbstractBsonWriter createBsonWriter(OutputStream bsonOutput) throws IOException; diff --git a/serde-jackson/src/main/java/io/micronaut/serde/jackson/JacksonJsonMapper.java b/serde-jackson/src/main/java/io/micronaut/serde/jackson/JacksonJsonMapper.java index 8e3d71bd0..7108fc45b 100644 --- a/serde-jackson/src/main/java/io/micronaut/serde/jackson/JacksonJsonMapper.java +++ b/serde-jackson/src/main/java/io/micronaut/serde/jackson/JacksonJsonMapper.java @@ -125,6 +125,11 @@ private JacksonJsonMapper(@NonNull SerdeRegistry registry, this.specificSerializer = serializer; } + @Override + public SerdeRegistry getSerdeRegistry() { + return this.registry; + } + @NonNull @Override public JsonMapper createSpecific(@NonNull Argument type) { diff --git a/serde-jsonp/src/main/java/io/micronaut/serde/json/stream/JsonStreamMapper.java b/serde-jsonp/src/main/java/io/micronaut/serde/json/stream/JsonStreamMapper.java index 9d608f1b2..d90305f45 100644 --- a/serde-jsonp/src/main/java/io/micronaut/serde/json/stream/JsonStreamMapper.java +++ b/serde-jsonp/src/main/java/io/micronaut/serde/json/stream/JsonStreamMapper.java @@ -83,6 +83,11 @@ private JsonStreamMapper(@NonNull SerdeRegistry registry, @Nullable SerdeConfigu this.view = view; } + @Override + public SerdeRegistry getSerdeRegistry() { + return this.registry; + } + @Override public ObjectMapper cloneWithConfiguration(@Nullable SerdeConfiguration configuration, @Nullable SerializationConfiguration serializationConfiguration, @Nullable DeserializationConfiguration deserializationConfiguration) { return new JsonStreamMapper(registry.cloneWithConfiguration(configuration, serializationConfiguration, deserializationConfiguration), configuration == null ? serdeConfiguration : configuration, view); diff --git a/serde-oracle-jdbc-json/src/main/java/io/micronaut/serde/oracle/jdbc/json/AbstractOracleJdbcJsonObjectMapper.java b/serde-oracle-jdbc-json/src/main/java/io/micronaut/serde/oracle/jdbc/json/AbstractOracleJdbcJsonObjectMapper.java index 86c3249c6..fa928a761 100644 --- a/serde-oracle-jdbc-json/src/main/java/io/micronaut/serde/oracle/jdbc/json/AbstractOracleJdbcJsonObjectMapper.java +++ b/serde-oracle-jdbc-json/src/main/java/io/micronaut/serde/oracle/jdbc/json/AbstractOracleJdbcJsonObjectMapper.java @@ -73,6 +73,11 @@ protected AbstractOracleJdbcJsonObjectMapper(SerdeRegistry registry, SerdeConfig this.view = view; } + @Override + public SerdeRegistry getSerdeRegistry() { + return this.registry; + } + abstract OracleJsonParser getJsonParser(InputStream inputStream); abstract OracleJsonGenerator createJsonGenerator(OutputStream outputStream);