This is an automated email from the ASF dual-hosted git repository.

snazy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git


The following commit(s) were added to refs/heads/main by this push:
     new 992a428a7 Migrate to Jackson mapper builder pattern (#3269)
992a428a7 is described below

commit 992a428a7c80947bc7a538380498897c960412b5
Author: Robert Stupp <[email protected]>
AuthorDate: Wed Dec 17 17:17:16 2025 +0100

    Migrate to Jackson mapper builder pattern (#3269)
    
    Mappers and factories are fully immutable objects in Jackson 3. This change 
is rather a no-op, but migrates the code to use the builder-pattern.
    
    This is only a little building-block for "real" Jackson 3 support, there's 
more to do and more that's required from other frameworks.
---
 .../core/admin/model/CatalogSerializationTest.java |  3 ++-
 .../auth/opa/model/OpaSchemaGenerator.java         |  4 ++--
 .../auth/opa/OpaPolarisAuthorizerFactory.java      |  3 ++-
 .../auth/opa/OpaPolarisAuthorizerTest.java         | 27 ++++++++++++++--------
 .../opa/token/FileBearerTokenProviderTest.java     |  5 ++--
 .../polaris/service/it/env/PolarisClient.java      |  3 ++-
 .../PolarisManagementServiceIntegrationTest.java   | 11 +++++----
 .../nosql/authz/impl/TestAclEntryImpl.java         | 11 ++++++++-
 .../persistence/nosql/authz/impl/TestAclImpl.java  |  3 ++-
 .../nosql/authz/impl/TestPrivilegeSetImpl.java     | 10 +++++++-
 .../nosql/api/backend/TestPersistId.java           |  5 ++--
 .../persistence/nosql/api/obj/TestGenericObj.java  | 11 +++++++--
 .../persistence/nosql/api/obj/TestObjRef.java      |  5 ++--
 .../distcache/CacheInvalidationReceiver.java       |  6 +++--
 .../quarkus/distcache/CacheInvalidationSender.java |  3 ++-
 .../nosql/impl/PersistenceImplementation.java      | 11 +++++----
 .../nosql/impl/cache/CaffeineCacheBackend.java     | 11 +++++----
 .../nosql/coretypes/changes/ChangeSerializer.java  |  7 +++---
 .../nosql/coretypes/mapping/BaseTestMapping.java   |  3 ++-
 .../core/connection/ConnectionConfigInfoDpo.java   | 11 ++++++---
 .../apache/polaris/core/entity/PolarisEvent.java   |  3 ++-
 .../core/persistence/PolarisObjectMapperUtil.java  |  3 ++-
 .../persistence/bootstrap/RootCredentialsSet.java  |  7 +++---
 .../core/persistence/pagination/PageTokenUtil.java |  3 ++-
 .../core/policy/PolarisPolicyMappingRecord.java    |  3 ++-
 .../core/policy/content/PolicyContentUtil.java     |  3 ++-
 .../storage/PolarisStorageConfigurationInfo.java   | 11 ++++++---
 .../gcp/GcpCredentialsStorageIntegration.java      |  5 +++-
 .../connection/ConnectionConfigInfoDpoTest.java    |  3 ++-
 .../core/secrets/UserSecretsManagerBaseTest.java   |  3 ++-
 .../PolarisStorageConfigurationInfoTest.java       |  3 ++-
 .../gcp/GcpCredentialsStorageIntegrationTest.java  |  9 ++++----
 .../service/config/ProductionReadinessChecks.java  |  6 ++---
 33 files changed, 143 insertions(+), 72 deletions(-)

diff --git 
a/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java
 
b/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java
index 3244f1473..d3ad2b1d7 100644
--- 
a/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java
+++ 
b/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java
@@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.stream.Stream;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -39,7 +40,7 @@ public class CatalogSerializationTest {
 
   @BeforeEach
   public void setUp() {
-    mapper = new ObjectMapper();
+    mapper = JsonMapper.builder().build();
   }
 
   @ParameterizedTest(name = "{0}")
diff --git 
a/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java
 
b/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java
index be08c234b..6800619c6 100644
--- 
a/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java
+++ 
b/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java
@@ -20,6 +20,7 @@ package org.apache.polaris.extension.auth.opa.model;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
 import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
 import java.io.IOException;
@@ -44,8 +45,7 @@ public class OpaSchemaGenerator {
    * @throws IOException if schema generation fails
    */
   public static String generateSchema() throws IOException {
-    ObjectMapper mapper = new ObjectMapper();
-    mapper.enable(SerializationFeature.INDENT_OUTPUT);
+    ObjectMapper mapper = 
JsonMapper.builder().enable(SerializationFeature.INDENT_OUTPUT).build();
 
     JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
     JsonSchema schema = schemaGen.generateSchema(OpaAuthorizationInput.class);
diff --git 
a/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java
 
b/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java
index c3f72b4fa..fd0ab46bc 100644
--- 
a/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java
+++ 
b/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java
@@ -19,6 +19,7 @@
 package org.apache.polaris.extension.auth.opa;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import io.smallrye.common.annotation.Identifier;
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.PreDestroy;
@@ -60,7 +61,7 @@ class OpaPolarisAuthorizerFactory implements 
PolarisAuthorizerFactory {
     this.opaConfig = opaConfig;
     this.clock = clock;
     this.asyncExec = asyncExec;
-    this.objectMapper = new ObjectMapper();
+    this.objectMapper = JsonMapper.builder().build();
   }
 
   /**
diff --git 
a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java
 
b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java
index 7401004a8..4336a9628 100644
--- 
a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java
+++ 
b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpHandler;
 import com.sun.net.httpserver.HttpServer;
@@ -75,7 +76,7 @@ public class OpaPolarisAuthorizerTest {
               "http://localhost:"; + server.getAddress().getPort() + 
"/v1/data/polaris/allow");
       OpaPolarisAuthorizer authorizer =
           new OpaPolarisAuthorizer(
-              policyUri, HttpClients.createDefault(), new ObjectMapper(), 
null);
+              policyUri, HttpClients.createDefault(), 
JsonMapper.builder().build(), null);
 
       PolarisPrincipal principal =
           PolarisPrincipal.of("eve", Map.of("department", "finance"), 
Set.of("auditor"));
@@ -95,7 +96,7 @@ public class OpaPolarisAuthorizerTest {
                       secondary));
 
       // Parse and verify JSON structure from captured request
-      ObjectMapper mapper = new ObjectMapper();
+      ObjectMapper mapper = JsonMapper.builder().build();
       JsonNode root = mapper.readTree(capturedRequestBody[0]);
       assertThat(root.has("input")).as("Root should have 'input' 
field").isTrue();
       var input = root.get("input");
@@ -120,7 +121,7 @@ public class OpaPolarisAuthorizerTest {
               "http://localhost:"; + server.getAddress().getPort() + 
"/v1/data/polaris/allow");
       OpaPolarisAuthorizer authorizer =
           new OpaPolarisAuthorizer(
-              policyUri, HttpClients.createDefault(), new ObjectMapper(), 
null);
+              policyUri, HttpClients.createDefault(), 
JsonMapper.builder().build(), null);
 
       // Set up a realistic principal
       PolarisPrincipal principal =
@@ -185,7 +186,7 @@ public class OpaPolarisAuthorizerTest {
                       null));
 
       // Parse and verify the complete JSON structure
-      ObjectMapper mapper = new ObjectMapper();
+      ObjectMapper mapper = JsonMapper.builder().build();
       JsonNode root = mapper.readTree(capturedRequestBody[0]);
 
       // Verify top-level structure
@@ -273,7 +274,7 @@ public class OpaPolarisAuthorizerTest {
               "http://localhost:"; + server.getAddress().getPort() + 
"/v1/data/polaris/allow");
       OpaPolarisAuthorizer authorizer =
           new OpaPolarisAuthorizer(
-              policyUri, HttpClients.createDefault(), new ObjectMapper(), 
null);
+              policyUri, HttpClients.createDefault(), 
JsonMapper.builder().build(), null);
 
       // Set up a realistic principal
       PolarisPrincipal principal =
@@ -350,7 +351,7 @@ public class OpaPolarisAuthorizerTest {
                       null));
 
       // Parse and verify the complete JSON structure
-      ObjectMapper mapper = new ObjectMapper();
+      ObjectMapper mapper = JsonMapper.builder().build();
       JsonNode root = mapper.readTree(capturedRequestBody[0]);
 
       // Verify top-level structure
@@ -437,7 +438,7 @@ public class OpaPolarisAuthorizerTest {
               "http://localhost:"; + server.getAddress().getPort() + 
"/v1/data/polaris/allow");
       OpaPolarisAuthorizer authorizer =
           new OpaPolarisAuthorizer(
-              policyUri, HttpClients.createDefault(), new ObjectMapper(), 
null);
+              policyUri, HttpClients.createDefault(), 
JsonMapper.builder().build(), null);
 
       PolarisPrincipal principal = PolarisPrincipal.of("alice", Map.of(), 
Set.of("admin"));
 
@@ -483,7 +484,7 @@ public class OpaPolarisAuthorizerTest {
     URI policyUri = 
URI.create("http://opa.example.com:8181/v1/data/polaris/allow";);
     OpaPolarisAuthorizer authorizer =
         new OpaPolarisAuthorizer(
-            policyUri, HttpClients.createDefault(), new ObjectMapper(), 
tokenProvider);
+            policyUri, HttpClients.createDefault(), 
JsonMapper.builder().build(), tokenProvider);
 
     assertThat(authorizer).isNotNull();
   }
@@ -499,7 +500,10 @@ public class OpaPolarisAuthorizerTest {
     BearerTokenProvider tokenProvider = new 
StaticBearerTokenProvider("test-bearer-token");
     OpaPolarisAuthorizer authorizer =
         new OpaPolarisAuthorizer(
-            policyUri, mock(CloseableHttpClient.class), new ObjectMapper(), 
tokenProvider) {
+            policyUri,
+            mock(CloseableHttpClient.class),
+            JsonMapper.builder().build(),
+            tokenProvider) {
           @Override
           <T> T httpClientExecute(
               ClassicHttpRequest request, HttpClientResponseHandler<? extends 
T> responseHandler)
@@ -541,7 +545,10 @@ public class OpaPolarisAuthorizerTest {
     // Create authorizer with the token provider instead of static token
     OpaPolarisAuthorizer authorizer =
         new OpaPolarisAuthorizer(
-            policyUri, mock(CloseableHttpClient.class), new ObjectMapper(), 
tokenProvider) {
+            policyUri,
+            mock(CloseableHttpClient.class),
+            JsonMapper.builder().build(),
+            tokenProvider) {
           @Override
           <T> T httpClientExecute(
               ClassicHttpRequest request, HttpClientResponseHandler<? extends 
T> responseHandler)
diff --git 
a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java
 
b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java
index 6dc53817a..62f1fe9bd 100644
--- 
a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java
+++ 
b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java
@@ -23,6 +23,7 @@ import static 
org.assertj.core.api.Assertions.assertThatIllegalStateException;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -401,7 +402,7 @@ public class FileBearerTokenProviderTest {
   /** Helper method to create a JWT with a specific expiration time. */
   private String createJwtWithExpiration(Instant expiration) {
     try {
-      ObjectMapper mapper = new ObjectMapper();
+      ObjectMapper mapper = JsonMapper.builder().build();
 
       // Create header
       Map<String, Object> header = new HashMap<>();
@@ -438,7 +439,7 @@ public class FileBearerTokenProviderTest {
   /** Helper method to create a JWT without an expiration claim. */
   private String createJwtWithoutExpiration() {
     try {
-      ObjectMapper mapper = new ObjectMapper();
+      ObjectMapper mapper = JsonMapper.builder().build();
 
       // Create header
       Map<String, Object> header = new HashMap<>();
diff --git 
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java
 
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java
index d9b1bfbbb..2a5c31eea 100644
--- 
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java
+++ 
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java
@@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import jakarta.ws.rs.client.Client;
 import java.net.URI;
 import java.util.Map;
@@ -64,7 +65,7 @@ public final class PolarisClient implements AutoCloseable {
    * ObjectMapper} if the make custom {@link 
PolarisServerManager#createClient() clients}.
    */
   public static ObjectMapper buildObjectMapper() {
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     mapper.setVisibility(PropertyAccessor.FIELD, 
JsonAutoDetect.Visibility.ANY);
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     mapper.setPropertyNamingStrategy(new 
PropertyNamingStrategies.KebabCaseStrategy());
diff --git 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java
 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java
index 0bf433d18..7b7d6febb 100644
--- 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java
+++ 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java
@@ -29,6 +29,7 @@ import com.auth0.jwt.JWTCreator;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableMap;
 import jakarta.ws.rs.client.Entity;
@@ -159,7 +160,7 @@ public class PolarisManagementServiceIntegrationTest {
                     .build())
             .build();
 
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     String json = mapper.writeValueAsString(catalog);
     System.out.println(json);
     Catalog deserialized = mapper.readValue(json, Catalog.class);
@@ -334,7 +335,7 @@ public class PolarisManagementServiceIntegrationTest {
             .setStorageType(StorageConfigInfo.StorageTypeEnum.S3)
             .setAllowedLocations(List.of("s3://my-old-bucket/path/to/data"))
             .build();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode storageConfig = mapper.valueToTree(awsConfigModel);
     ObjectNode catalogNode = mapper.createObjectNode();
     catalogNode.set("storageConfigInfo", storageConfig);
@@ -359,7 +360,7 @@ public class PolarisManagementServiceIntegrationTest {
             .setStorageType(StorageConfigInfo.StorageTypeEnum.S3)
             .setAllowedLocations(List.of("s3://my-old-bucket/path/to/data"))
             .build();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode storageConfig = mapper.valueToTree(awsConfigModel);
     ObjectNode catalogNode = mapper.createObjectNode();
     catalogNode.set("storageConfigInfo", storageConfig);
@@ -513,7 +514,7 @@ public class PolarisManagementServiceIntegrationTest {
             .setStorageType(StorageConfigInfo.StorageTypeEnum.S3)
             .setAllowedLocations(List.of("s3://my-old-bucket/path/to/data"))
             .build();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode storageConfig = mapper.valueToTree(awsConfigModel);
     ObjectNode catalogNode = mapper.createObjectNode();
     catalogNode.set("storageConfigInfo", storageConfig);
@@ -534,7 +535,7 @@ public class PolarisManagementServiceIntegrationTest {
   @Test
   public void serialization() {
     CatalogProperties properties = new 
CatalogProperties("s3://my-bucket/path/to/data");
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     CatalogProperties translated = mapper.convertValue(properties, 
CatalogProperties.class);
     assertThat(translated.toMap())
         .containsEntry("default-base-location", "s3://my-bucket/path/to/data");
diff --git 
a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java
 
b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java
index 0fec66b36..270409b4a 100644
--- 
a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java
+++ 
b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java
@@ -18,7 +18,11 @@
  */
 package org.apache.polaris.persistence.nosql.authz.impl;
 
+import static 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
+import static 
com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
+
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.stream.Stream;
 import org.apache.polaris.persistence.nosql.authz.api.AclEntry;
 import org.apache.polaris.persistence.nosql.authz.api.Privilege;
@@ -39,7 +43,12 @@ public class TestAclEntryImpl {
 
   @BeforeAll
   static void setUp() {
-    mapper = new ObjectMapper().findAndRegisterModules();
+    mapper =
+        JsonMapper.builder()
+            .findAndAddModules()
+            .disable(FAIL_ON_UNKNOWN_PROPERTIES)
+            .enable(DEFAULT_VIEW_INCLUSION)
+            .build();
     privileges =
         new PrivilegesImpl(Stream.of(new PrivilegesTestProvider()), new 
PrivilegesTestRepository());
     JacksonPrivilegesModule.CDIResolver.setResolver(x -> privileges);
diff --git 
a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java
 
b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java
index 552141279..adf935652 100644
--- 
a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java
+++ 
b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java
@@ -19,6 +19,7 @@
 package org.apache.polaris.persistence.nosql.authz.impl;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.stream.Stream;
 import org.apache.polaris.persistence.nosql.authz.api.Acl;
 import org.apache.polaris.persistence.nosql.authz.api.Privilege;
@@ -41,7 +42,7 @@ public class TestAclImpl {
 
   @BeforeAll
   static void setUp() {
-    mapper = new ObjectMapper().findAndRegisterModules();
+    mapper = JsonMapper.builder().findAndAddModules().build();
     privileges =
         new PrivilegesImpl(Stream.of(new PrivilegesTestProvider()), new 
PrivilegesTestRepository());
     JacksonPrivilegesModule.CDIResolver.setResolver(x -> privileges);
diff --git 
a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java
 
b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java
index 2832973f3..90f43fe25 100644
--- 
a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java
+++ 
b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java
@@ -18,11 +18,14 @@
  */
 package org.apache.polaris.persistence.nosql.authz.impl;
 
+import static 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
+import static 
com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
 import static java.util.Collections.singleton;
 import static org.junit.jupiter.params.provider.Arguments.arguments;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import java.util.ArrayList;
 import java.util.Set;
@@ -54,7 +57,12 @@ public class TestPrivilegeSetImpl {
 
   @BeforeAll
   static void setUp() {
-    mapper = new ObjectMapper().findAndRegisterModules();
+    mapper =
+        JsonMapper.builder()
+            .findAndAddModules()
+            .disable(FAIL_ON_UNKNOWN_PROPERTIES)
+            .enable(DEFAULT_VIEW_INCLUSION)
+            .build();
     privileges =
         new PrivilegesImpl(Stream.of(new PrivilegesTestProvider()), new 
PrivilegesTestRepository());
     JacksonPrivilegesModule.CDIResolver.setResolver(x -> privileges);
diff --git 
a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java
 
b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java
index 5f1eb2741..3c73a1dcd 100644
--- 
a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java
+++ 
b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java
@@ -22,6 +22,7 @@ import static java.lang.String.format;
 import static org.junit.jupiter.params.provider.Arguments.arguments;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -47,8 +48,8 @@ public class TestPersistId {
 
   @BeforeEach
   protected void setUp() {
-    mapper = new ObjectMapper();
-    smile = new SmileMapper();
+    mapper = JsonMapper.builder().build();
+    smile = SmileMapper.builder().build();
   }
 
   @Test
diff --git 
a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java
 
b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java
index c544edf2b..90dec495d 100644
--- 
a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java
+++ 
b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java
@@ -18,11 +18,13 @@
  */
 package org.apache.polaris.persistence.nosql.api.obj;
 
+import static 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
+import static 
com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
 import static 
org.apache.polaris.persistence.nosql.api.obj.ObjSerializationHelper.contextualReader;
 import static 
org.apache.polaris.persistence.nosql.api.obj.ObjTypes.objTypeById;
 import static org.junit.jupiter.params.provider.Arguments.arguments;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.UUID;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Stream;
@@ -41,7 +43,12 @@ public class TestGenericObj {
   @ParameterizedTest
   @MethodSource
   public void genericObj(ObjType realType, long id, Obj realObj) throws 
Exception {
-    var mapper = new ObjectMapper().findAndRegisterModules();
+    var mapper =
+        JsonMapper.builder()
+            .findAndAddModules()
+            .disable(FAIL_ON_UNKNOWN_PROPERTIES)
+            .enable(DEFAULT_VIEW_INCLUSION)
+            .build();
     // Use some view to exclude the type,id,createdAtMicros,versionToken 
attributes from being
     // serialized by Jackson.
     var writerAllAttributes = mapper.writer();
diff --git 
a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java
 
b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java
index bd8390bfd..0a47addc1 100644
--- 
a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java
+++ 
b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java
@@ -23,6 +23,7 @@ import static 
org.apache.polaris.persistence.nosql.api.obj.ObjRef.OBJ_REF_SERIAL
 import static org.apache.polaris.persistence.nosql.api.obj.ObjRef.objRef;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper;
 import java.nio.ByteBuffer;
 import java.util.Base64;
@@ -46,8 +47,8 @@ public class TestObjRef {
 
   @BeforeEach
   protected void setUp() {
-    mapper = new ObjectMapper();
-    smile = new SmileMapper();
+    mapper = JsonMapper.builder().build();
+    smile = SmileMapper.builder().build();
   }
 
   @Test
diff --git 
a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java
 
b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java
index d106043fc..6a717111c 100644
--- 
a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java
+++ 
b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java
@@ -22,6 +22,7 @@ import static 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKN
 import static java.util.Collections.emptyList;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import io.quarkus.vertx.http.ManagementInterface;
 import io.vertx.ext.web.RoutingContext;
 import jakarta.enterprise.context.ApplicationScoped;
@@ -70,9 +71,10 @@ class CacheInvalidationReceiver {
     this.validTokens =
         new 
HashSet<>(storeConfig.cacheInvalidationValidTokens().orElse(emptyList()));
     this.objectMapper =
-        new ObjectMapper()
+        JsonMapper.builder()
             // forward compatibility
-            .disable(FAIL_ON_UNKNOWN_PROPERTIES);
+            .disable(FAIL_ON_UNKNOWN_PROPERTIES)
+            .build();
   }
 
   void registerManagementRoutes(@Observes ManagementInterface mi) {
diff --git 
a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java
 
b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java
index b23731712..3d10a91b0 100644
--- 
a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java
+++ 
b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java
@@ -31,6 +31,7 @@ import static 
org.apache.polaris.persistence.nosql.quarkus.distcache.QuarkusDist
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.google.common.annotations.VisibleForTesting;
 import io.quarkus.runtime.Startup;
 import io.vertx.core.Future;
@@ -85,7 +86,7 @@ class CacheInvalidationSender implements 
DistributedCacheInvalidation.Sender {
   private final String invalidationUri;
   private final long requestTimeout;
 
-  private final ObjectMapper objectMapper = new ObjectMapper();
+  private final ObjectMapper objectMapper = JsonMapper.builder().build();
   private final Lock lock = new ReentrantLock();
   private final int batchSize;
   private final BlockingQueue<CacheInvalidation> invalidations = new 
LinkedBlockingQueue<>();
diff --git 
a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java
 
b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java
index eff4a17ef..9155d9456 100644
--- 
a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java
+++ 
b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java
@@ -18,6 +18,8 @@
  */
 package org.apache.polaris.persistence.nosql.impl;
 
+import static 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
+import static 
com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static java.lang.String.format;
@@ -28,7 +30,6 @@ import static 
org.apache.polaris.persistence.nosql.api.obj.ObjSerializationHelpe
 import static 
org.apache.polaris.persistence.nosql.api.obj.ObjTypes.objTypeById;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectWriter;
 import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
@@ -77,9 +78,11 @@ import 
org.apache.polaris.persistence.nosql.impl.indexes.IndexesProvider;
  */
 public final class PersistenceImplementation implements Persistence {
   private static final ObjectMapper SMILE_MAPPER =
-      new SmileMapper()
-          .findAndRegisterModules()
-          .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+      SmileMapper.builder()
+          .findAndAddModules()
+          .disable(FAIL_ON_UNKNOWN_PROPERTIES)
+          .enable(DEFAULT_VIEW_INCLUSION)
+          .build();
   private static final ObjectWriter OBJ_WRITER =
       SMILE_MAPPER.writer().withView(Obj.StorageView.class);
 
diff --git 
a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java
 
b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java
index b38959b61..992a83422 100644
--- 
a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java
+++ 
b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java
@@ -18,6 +18,8 @@
  */
 package org.apache.polaris.persistence.nosql.impl.cache;
 
+import static 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
+import static 
com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
 import static com.google.common.base.Preconditions.checkState;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.concurrent.TimeUnit.MICROSECONDS;
@@ -39,7 +41,6 @@ import static 
org.apache.polaris.persistence.varint.VarInt.readVarInt;
 import static org.apache.polaris.persistence.varint.VarInt.varIntLen;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectWriter;
 import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper;
@@ -699,9 +700,11 @@ class CaffeineCacheBackend implements CacheBackend {
   static final int CAFFEINE_OBJ_OVERHEAD = 2 * 32;
 
   static final ObjectMapper SMILE_MAPPER =
-      new SmileMapper()
-          .findAndRegisterModules()
-          .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+      SmileMapper.builder()
+          .findAndAddModules()
+          .disable(FAIL_ON_UNKNOWN_PROPERTIES)
+          .enable(DEFAULT_VIEW_INCLUSION)
+          .build();
   private static final ObjectWriter OBJ_WRITER = 
SMILE_MAPPER.writer().withView(Object.class);
 
   static byte[] serializeObj(Obj obj) {
diff --git 
a/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java
 
b/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java
index 3ed209d76..c7ef86557 100644
--- 
a/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java
+++ 
b/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java
@@ -47,9 +47,10 @@ import org.apache.polaris.persistence.nosql.api.obj.ObjRef;
  */
 final class ChangeSerializer implements IndexValueSerializer<Change> {
   static ObjectMapper MAPPER =
-      new SmileMapper()
-          .findAndRegisterModules()
-          .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+      SmileMapper.builder()
+          .findAndAddModules()
+          .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+          .build();
 
   @Override
   public int serializedSize(@Nullable Change value) {
diff --git 
a/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java
 
b/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java
index 9397e2b68..bad9e3aff 100644
--- 
a/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java
+++ 
b/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java
@@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThatCode;
 import static 
org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.io.IOException;
 import java.time.Instant;
 import java.util.HashMap;
@@ -73,7 +74,7 @@ public abstract class BaseTestMapping {
 
   @BeforeAll
   public static void beforeAll() {
-    objectMapper = new ObjectMapper().findAndRegisterModules();
+    objectMapper = JsonMapper.builder().findAndAddModules().build();
   }
 
   public BaseMapping<?, ?> mapping;
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java
index 555a4008d..85d32de5e 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java
@@ -26,6 +26,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import jakarta.annotation.Nonnull;
 import jakarta.annotation.Nullable;
 import java.net.MalformedURLException;
@@ -123,9 +124,13 @@ public abstract class ConnectionConfigInfoDpo implements 
IcebergCatalogPropertie
   private static final ObjectMapper DEFAULT_MAPPER;
 
   static {
-    DEFAULT_MAPPER = new ObjectMapper();
-    DEFAULT_MAPPER.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
-    DEFAULT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+    DEFAULT_MAPPER =
+        JsonMapper.builder()
+            .defaultPropertyInclusion(
+                JsonInclude.Value.construct(
+                    JsonInclude.Include.NON_NULL, 
JsonInclude.Include.NON_NULL))
+            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+            .build();
   }
 
   public String serialize() {
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java 
b/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java
index 424ffa916..9c5a8d1b7 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import jakarta.annotation.Nullable;
 import java.util.Map;
 
@@ -31,7 +32,7 @@ public class PolarisEvent {
 
   // to serialize/deserialize properties
   // TODO: Look into using the CDI-managed `ObjectMapper` object
-  private static final ObjectMapper MAPPER = new ObjectMapper();
+  private static final ObjectMapper MAPPER = JsonMapper.builder().build();
 
   // catalog id
   private final String catalogId;
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java
index f89bee358..6f805b030 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java
@@ -25,6 +25,7 @@ import com.fasterxml.jackson.core.JsonToken;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import jakarta.annotation.Nullable;
 import java.io.IOException;
 import java.util.Map;
@@ -42,7 +43,7 @@ public final class PolarisObjectMapperUtil {
   private static final ObjectMapper MAPPER = configureMapper();
 
   private static ObjectMapper configureMapper() {
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
     RESTSerializers.registerAll(mapper);
     return mapper;
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java
index 082d1c2b9..d1a2d8e25 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java
@@ -25,7 +25,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
@@ -151,9 +151,8 @@ public interface RootCredentialsSet {
   }
 
   private static RootCredentialsSet fromInputStream(InputStream in) throws 
IOException {
-    YAMLFactory factory = new YAMLFactory();
-    ObjectMapper mapper = new 
ObjectMapper(factory).configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
-    try (var parser = factory.createParser(in)) {
+    ObjectMapper mapper = 
YAMLMapper.builder().configure(FAIL_ON_UNKNOWN_PROPERTIES, false).build();
+    try (var parser = mapper.createParser(in)) {
       var values = mapper.readValues(parser, RootCredentialsSet.class);
       var builder = ImmutableRootCredentialsSet.builder();
       while (values.hasNext()) {
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java
index 0b6255192..68c389cb9 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java
@@ -44,7 +44,8 @@ import java.util.function.BooleanSupplier;
 
 final class PageTokenUtil {
 
-  private static final ObjectMapper SMILE_MAPPER = new 
SmileMapper().findAndRegisterModules();
+  private static final ObjectMapper SMILE_MAPPER =
+      SmileMapper.builder().findAndAddModules().build();
 
   /** Constant for {@link PageToken#readEverything()}. */
   static final PageToken READ_EVERYTHING =
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java
index 2d3ccb578..e5acfad0c 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -30,7 +31,7 @@ import java.util.Objects;
 public class PolarisPolicyMappingRecord {
   // to serialize/deserialize properties
   public static final String EMPTY_MAP_STRING = "{}";
-  private static final ObjectMapper MAPPER = new ObjectMapper();
+  private static final ObjectMapper MAPPER = JsonMapper.builder().build();
 
   // id of the catalog where target entity resides
   private long targetCatalogId;
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java
index 2ba025a66..e23f082e2 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java
@@ -20,12 +20,13 @@ package org.apache.polaris.core.policy.content;
 
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 
 public class PolicyContentUtil {
   public static final ObjectMapper MAPPER = configureMapper();
 
   private static ObjectMapper configureMapper() {
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     // Fails if a required field (in the constructor) is missing
     
mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, 
true);
     // Fails if a required field is present but explicitly null, e.g., 
{"enable": null}
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
index 8edc8380d..930da1fb6 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
@@ -26,6 +26,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import jakarta.annotation.Nonnull;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -87,9 +88,13 @@ public abstract class PolarisStorageConfigurationInfo {
   private static final ObjectMapper DEFAULT_MAPPER;
 
   static {
-    DEFAULT_MAPPER = new ObjectMapper();
-    DEFAULT_MAPPER.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
-    DEFAULT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+    DEFAULT_MAPPER =
+        JsonMapper.builder()
+            .defaultPropertyInclusion(
+                JsonInclude.Value.construct(
+                    JsonInclude.Include.NON_NULL, 
JsonInclude.Include.NON_NULL))
+            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+            .build();
   }
 
   public String serialize() {
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java
index 427f715c1..b18641f62 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java
@@ -20,6 +20,7 @@ package org.apache.polaris.core.storage.gcp;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.google.api.gax.core.FixedCredentialsProvider;
 import com.google.auth.http.HttpTransportFactory;
 import com.google.auth.oauth2.AccessToken;
@@ -69,6 +70,8 @@ public class GcpCredentialsStorageIntegration
   public static final String IMPERSONATION_SCOPE =
       "https://www.googleapis.com/auth/devstorage.read_write";;
 
+  private static final ObjectMapper OBJECT_MAPPER = 
JsonMapper.builder().build();
+
   private final GoogleCredentials sourceCredentials;
   private final HttpTransportFactory transportFactory;
 
@@ -181,7 +184,7 @@ public class GcpCredentialsStorageIntegration
 
   private String convertToString(CredentialAccessBoundary accessBoundary) {
     try {
-      return new ObjectMapper().writeValueAsString(accessBoundary);
+      return OBJECT_MAPPER.writeValueAsString(accessBoundary);
     } catch (JsonProcessingException e) {
       LOGGER.warn("Unable to convert access boundary to json", e);
       return Objects.toString(accessBoundary);
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java
index 5d8dbc7d4..1ba01b730 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.Optional;
 import org.apache.polaris.core.admin.model.AwsIamServiceIdentityInfo;
 import org.apache.polaris.core.admin.model.ConnectionConfigInfo;
@@ -34,7 +35,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 public class ConnectionConfigInfoDpoTest {
-  private static final ObjectMapper objectMapper = new ObjectMapper();
+  private static final ObjectMapper objectMapper = 
JsonMapper.builder().build();
 
   static {
     objectMapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java
index 287a885b4..21949c48e 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java
@@ -20,6 +20,7 @@ package org.apache.polaris.core.secrets;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import org.apache.polaris.core.entity.CatalogEntity;
 import org.apache.polaris.core.entity.PolarisEntity;
 import org.assertj.core.api.Assertions;
@@ -30,7 +31,7 @@ import org.junit.jupiter.api.Test;
  * implementation-specific unittests.
  */
 public abstract class UserSecretsManagerBaseTest {
-  private static final ObjectMapper DEFAULT_MAPPER = new ObjectMapper();
+  private static final ObjectMapper DEFAULT_MAPPER = 
JsonMapper.builder().build();
 
   /**
    * @return a fresh instance of a UserSecretsManager to use in test cases.
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java
index 865cff17e..35d4ed809 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java
@@ -23,6 +23,7 @@ import static 
org.junit.jupiter.params.provider.Arguments.arguments;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import java.util.stream.Stream;
 import org.apache.polaris.core.storage.FileStorageConfigurationInfo;
 import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo;
@@ -46,7 +47,7 @@ public class PolarisStorageConfigurationInfoTest {
 
   @BeforeAll
   public static void setup() {
-    mapper = new ObjectMapper();
+    mapper = JsonMapper.builder().build();
   }
 
   @ParameterizedTest
diff --git 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java
 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java
index 145b80319..0e83090d9 100644
--- 
a/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java
+++ 
b/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.databind.node.ContainerNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.api.client.http.javanet.NetHttpTransport;
@@ -199,7 +200,7 @@ class GcpCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
         GcpCredentialsStorageIntegration.generateAccessBoundaryRules(
             true, Set.of("gs://bucket1/path/to/data"), 
Set.of("gs://bucket1/path/to/data"));
     assertThat(credentialAccessBoundary).isNotNull();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, 
JsonNode.class);
     JsonNode refRules = readResource(mapper, 
"gcp-testGenerateAccessBoundary.json");
     assertThat(parsedRules)
@@ -221,7 +222,7 @@ class GcpCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
                 "gs://bucket2/a/super/path/to/data"),
             Set.of("gs://bucket1/normal/path/to/data"));
     assertThat(credentialAccessBoundary).isNotNull();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, 
JsonNode.class);
     JsonNode refRules =
         readResource(mapper, 
"gcp-testGenerateAccessBoundaryWithMultipleBuckets.json");
@@ -241,7 +242,7 @@ class GcpCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
             Set.of("gs://bucket1/path/to/data", 
"gs://bucket1/another/path/to/data"),
             Set.of("gs://bucket1/path/to/data"));
     assertThat(credentialAccessBoundary).isNotNull();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, 
JsonNode.class);
     JsonNode refRules = readResource(mapper, 
"gcp-testGenerateAccessBoundaryWithoutList.json");
     assertThat(parsedRules)
@@ -260,7 +261,7 @@ class GcpCredentialsStorageIntegrationTest extends 
BaseStorageIntegrationTest {
             Set.of("gs://bucket1/normal/path/to/data", 
"gs://bucket1/awesome/path/to/data"),
             Set.of());
     assertThat(credentialAccessBoundary).isNotNull();
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = JsonMapper.builder().build();
     JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, 
JsonNode.class);
     JsonNode refRules = readResource(mapper, 
"gcp-testGenerateAccessBoundaryWithoutWrites.json");
     assertThat(parsedRules)
diff --git 
a/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java
 
b/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java
index c1a03a7ab..f970fe92a 100644
--- 
a/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java
+++ 
b/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java
@@ -20,7 +20,7 @@ package org.apache.polaris.service.config;
 
 import static java.lang.String.format;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.event.Observes;
 import jakarta.enterprise.event.Startup;
@@ -254,7 +254,7 @@ public class ProductionReadinessChecks {
             });
 
     var storageTypes = FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES;
-    var mapper = new ObjectMapper();
+    var mapper = JsonMapper.builder().build();
     var defaults = featureConfiguration.parseDefaults(mapper);
     var realmOverrides = featureConfiguration.parseRealmOverrides(mapper);
     @SuppressWarnings("unchecked")
@@ -329,7 +329,7 @@ public class ProductionReadinessChecks {
   public ProductionReadinessCheck checkConnectionCredentialVendors(
       Instance<ConnectionCredentialVendor> credentialVendors,
       FeaturesConfiguration featureConfiguration) {
-    var mapper = new ObjectMapper();
+    var mapper = JsonMapper.builder().build();
     var defaults = featureConfiguration.parseDefaults(mapper);
     var realmOverrides = featureConfiguration.parseRealmOverrides(mapper);
 

Reply via email to