This is an automated email from the ASF dual-hosted git repository.
mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new cf7f9d9d939 [improve][all] Upgraded Jackson to 2.21 LTS and fixed a
few gradle assemble warnings (#25504)
cf7f9d9d939 is described below
commit cf7f9d9d939f28f808c3b0d4f820f8a00b9262cb
Author: Abhilash Mandaliya <[email protected]>
AuthorDate: Mon Apr 13 11:12:25 2026 +0530
[improve][all] Upgraded Jackson to 2.21 LTS and fixed a few gradle assemble
warnings (#25504)
Co-authored-by: Matteo Merli <[email protected]>
---
.../main/kotlin/pulsar.java-conventions.gradle.kts | 6 +++++-
distribution/server/src/assemble/LICENSE.bin.txt | 22 +++++++++++-----------
distribution/shell/src/assemble/LICENSE.bin.txt | 22 +++++++++++-----------
gradle/libs.versions.toml | 5 +++--
.../pulsar/client/impl/PulsarClientImpl.java | 1 +
.../client/impl/conf/ConfigurationDataUtils.java | 2 +-
.../pulsar/client/impl/schema/JSONSchema.java | 3 +--
.../org/apache/pulsar/common/util/FieldParser.java | 15 ++++++++++++---
.../pulsar/common/util/ObjectMapperFactory.java | 11 ++++-------
9 files changed, 49 insertions(+), 38 deletions(-)
diff --git
a/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts
b/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts
index 54f81a983fb..a6f65cc23af 100644
--- a/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts
+++ b/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts
@@ -41,7 +41,11 @@ configurations.all {
// (EnumResolver.constructUsingToString signature changed in 2.19+).
resolutionStrategy.eachDependency {
if (requested.group.startsWith("com.fasterxml.jackson")) {
- useVersion(catalog.findVersion("jackson").get().requiredVersion)
+ if (requested.name == "jackson-annotations") {
+
useVersion(catalog.findVersion("jackson-annotations").get().requiredVersion)
+ } else {
+
useVersion(catalog.findVersion("jackson").get().requiredVersion)
+ }
}
}
}
diff --git a/distribution/server/src/assemble/LICENSE.bin.txt
b/distribution/server/src/assemble/LICENSE.bin.txt
index 838ed71321b..351d4884548 100644
--- a/distribution/server/src/assemble/LICENSE.bin.txt
+++ b/distribution/server/src/assemble/LICENSE.bin.txt
@@ -249,17 +249,17 @@ The Apache Software License, Version 2.0
- info.picocli-picocli-shell-jline3-4.7.5.jar
* High Performance Primitive Collections for Java --
com.carrotsearch-hppc-0.9.1.jar
* Jackson
- - com.fasterxml.jackson.core-jackson-annotations-2.18.6.jar
- - com.fasterxml.jackson.core-jackson-core-2.18.6.jar
- - com.fasterxml.jackson.core-jackson-databind-2.18.6.jar
- - com.fasterxml.jackson.dataformat-jackson-dataformat-yaml-2.18.6.jar
- - com.fasterxml.jackson.jaxrs-jackson-jaxrs-base-2.18.6.jar
- - com.fasterxml.jackson.jaxrs-jackson-jaxrs-json-provider-2.18.6.jar
- - com.fasterxml.jackson.module-jackson-module-jaxb-annotations-2.18.6.jar
- - com.fasterxml.jackson.module-jackson-module-jsonSchema-2.18.6.jar
- - com.fasterxml.jackson.datatype-jackson-datatype-jdk8-2.18.6.jar
- - com.fasterxml.jackson.datatype-jackson-datatype-jsr310-2.18.6.jar
- - com.fasterxml.jackson.module-jackson-module-parameter-names-2.18.6.jar
+ - com.fasterxml.jackson.core-jackson-annotations-2.21.jar
+ - com.fasterxml.jackson.core-jackson-core-2.21.2.jar
+ - com.fasterxml.jackson.core-jackson-databind-2.21.2.jar
+ - com.fasterxml.jackson.dataformat-jackson-dataformat-yaml-2.21.2.jar
+ - com.fasterxml.jackson.jaxrs-jackson-jaxrs-base-2.21.2.jar
+ - com.fasterxml.jackson.jaxrs-jackson-jaxrs-json-provider-2.21.2.jar
+ - com.fasterxml.jackson.module-jackson-module-jaxb-annotations-2.21.2.jar
+ - com.fasterxml.jackson.module-jackson-module-jsonSchema-2.21.2.jar
+ - com.fasterxml.jackson.datatype-jackson-datatype-jdk8-2.21.2.jar
+ - com.fasterxml.jackson.datatype-jackson-datatype-jsr310-2.21.2.jar
+ - com.fasterxml.jackson.module-jackson-module-parameter-names-2.21.2.jar
* Caffeine -- com.github.ben-manes.caffeine-caffeine-3.2.3.jar
* Conscrypt -- org.conscrypt-conscrypt-openjdk-uber-2.5.2.jar
* Proto Google Common Protos --
com.google.api.grpc-proto-google-common-protos-2.59.2.jar
diff --git a/distribution/shell/src/assemble/LICENSE.bin.txt
b/distribution/shell/src/assemble/LICENSE.bin.txt
index 6f33219de16..350f38dcdad 100644
--- a/distribution/shell/src/assemble/LICENSE.bin.txt
+++ b/distribution/shell/src/assemble/LICENSE.bin.txt
@@ -313,17 +313,17 @@ The Apache Software License, Version 2.0
- picocli-4.7.5.jar
- picocli-shell-jline3-4.7.5.jar
* Jackson
- - jackson-annotations-2.18.6.jar
- - jackson-core-2.18.6.jar
- - jackson-databind-2.18.6.jar
- - jackson-dataformat-yaml-2.18.6.jar
- - jackson-jaxrs-base-2.18.6.jar
- - jackson-jaxrs-json-provider-2.18.6.jar
- - jackson-module-jaxb-annotations-2.18.6.jar
- - jackson-module-jsonSchema-2.18.6.jar
- - jackson-datatype-jdk8-2.18.6.jar
- - jackson-datatype-jsr310-2.18.6.jar
- - jackson-module-parameter-names-2.18.6.jar
+ - jackson-annotations-2.21.jar
+ - jackson-core-2.21.2.jar
+ - jackson-databind-2.21.2.jar
+ - jackson-dataformat-yaml-2.21.2.jar
+ - jackson-jaxrs-base-2.21.2.jar
+ - jackson-jaxrs-json-provider-2.21.2.jar
+ - jackson-module-jaxb-annotations-2.21.2.jar
+ - jackson-module-jsonSchema-2.21.2.jar
+ - jackson-datatype-jdk8-2.21.2.jar
+ - jackson-datatype-jsr310-2.21.2.jar
+ - jackson-module-parameter-names-2.21.2.jar
* Caffeine -- caffeine-3.2.3.jar
* Conscrypt -- conscrypt-openjdk-uber-2.5.2.jar
* Gson
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index ce1c4747ede..b5a5aca4a67 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -29,7 +29,8 @@ netty = "4.1.132.Final"
netty-iouring = "0.0.26.Final"
jetty = "12.1.6"
jersey = "2.42"
-jackson = "2.18.6"
+jackson = "2.21.2"
+jackson-annotations = "2.21"
protobuf = "3.25.5"
grpc = "1.75.0"
slf4j = "2.0.17"
@@ -189,7 +190,7 @@ slog = { module = "io.github.merlimat.slog:slog",
version.ref = "slog" }
lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" }
# Jackson
jackson-bom = { module = "com.fasterxml.jackson:jackson-bom", version.ref =
"jackson" }
-jackson-annotations = { module =
"com.fasterxml.jackson.core:jackson-annotations", version.ref = "jackson" }
+jackson-annotations = { module =
"com.fasterxml.jackson.core:jackson-annotations", version.ref =
"jackson-annotations" }
jackson-core = { module = "com.fasterxml.jackson.core:jackson-core",
version.ref = "jackson" }
jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind",
version.ref = "jackson" }
jackson-module-parameter-names = { module =
"com.fasterxml.jackson.module:jackson-module-parameter-names", version.ref =
"jackson" }
diff --git
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
index 020786ee578..f7fa6b9a4c2 100644
---
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
+++
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
@@ -442,6 +442,7 @@ public class PulsarClientImpl implements PulsarClient {
}
+ @SuppressWarnings("unchecked")
public CompletableFuture<Void> reloadSchemaForAutoProduceProducer(String
topic, AutoProduceBytesSchema autoSchema) {
return
lookup.getSchema(TopicName.get(topic)).thenAccept(schemaInfoOptional -> {
if (schemaInfoOptional.isPresent()) {
diff --git
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/conf/ConfigurationDataUtils.java
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/conf/ConfigurationDataUtils.java
index 45cd56c2acf..1da466c3b14 100644
---
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/conf/ConfigurationDataUtils.java
+++
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/conf/ConfigurationDataUtils.java
@@ -36,7 +36,7 @@ public final class ConfigurationDataUtils {
// forward compatibility for the properties may go away in the future
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
true);
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL,
false);
- mapper.setSerializationInclusion(Include.NON_NULL);
+ mapper.setDefaultPropertyInclusion(Include.NON_NULL);
return mapper;
}
diff --git
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/JSONSchema.java
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/JSONSchema.java
index 0048ea921e0..d24819adc65 100644
---
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/JSONSchema.java
+++
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/JSONSchema.java
@@ -50,7 +50,7 @@ public class JSONSchema<T> extends AvroBaseStructSchema<T> {
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
// keep backwards compatibility, don't accept unknown enum values
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL,
false);
- mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
return mapper;
}
@@ -111,7 +111,6 @@ public class JSONSchema<T> extends AvroBaseStructSchema<T> {
/**
* Clears the caches tied to the ObjectMapper instances and replaces the
singleton ObjectMapper instance.
- *
* This can be used in tests to ensure that classloaders and class
references don't leak across tests.
*/
public static void clearCaches() {
diff --git
a/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
b/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
index 09ec31468a0..b30a359d191 100644
--- a/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
+++ b/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
@@ -21,6 +21,9 @@ package org.apache.pulsar.common.util;
import static com.google.common.base.Preconditions.checkArgument;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver;
import com.fasterxml.jackson.databind.util.EnumResolver;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -96,9 +99,15 @@ public final class FieldParser {
if (to.isEnum()) {
// Converting string to enum
- @SuppressWarnings("deprecation") // No replacement API available
in Jackson 2.x
- EnumResolver r = EnumResolver.constructUsingToString(
-
ObjectMapperFactory.getMapper().getObjectMapper().getDeserializationConfig(),
to);
+ DeserializationConfig deserializationConfig =
+
ObjectMapperFactory.getMapper().getObjectMapper().getDeserializationConfig();
+ // No replacement API available in Jackson 2.x
+ AnnotatedClass annotatedEnum = AnnotatedClassResolver.resolve(
+ deserializationConfig,
+ deserializationConfig.getTypeFactory().constructType(to),
+ deserializationConfig
+ );
+ EnumResolver r =
EnumResolver.constructUsingToString(deserializationConfig, annotatedEnum);
T value = (T) r.findEnum((String) from);
if (value == null) {
throw new RuntimeException("Invalid value '" + from + "' for
enum " + to);
diff --git
a/pulsar-common/src/main/java/org/apache/pulsar/common/util/ObjectMapperFactory.java
b/pulsar-common/src/main/java/org/apache/pulsar/common/util/ObjectMapperFactory.java
index 0c7b51781c5..5814e0237f3 100644
---
a/pulsar-common/src/main/java/org/apache/pulsar/common/util/ObjectMapperFactory.java
+++
b/pulsar-common/src/main/java/org/apache/pulsar/common/util/ObjectMapperFactory.java
@@ -32,6 +32,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import java.util.concurrent.atomic.AtomicReference;
import lombok.CustomLog;
+import lombok.Getter;
import org.apache.pulsar.client.admin.internal.data.AuthPoliciesImpl;
import org.apache.pulsar.common.functions.FunctionConfig;
import org.apache.pulsar.common.functions.FunctionState;
@@ -116,6 +117,7 @@ import
org.apache.pulsar.policies.data.loadbalancer.LoadReportDeserializer;
@CustomLog
public class ObjectMapperFactory {
public static class MapperReference {
+ @Getter
private final ObjectMapper objectMapper;
private final ObjectWriter objectWriter;
private final ObjectReader objectReader;
@@ -126,10 +128,6 @@ public class ObjectMapperFactory {
this.objectReader = objectMapper.reader();
}
- public ObjectMapper getObjectMapper() {
- return objectMapper;
- }
-
public ObjectWriter writer() {
return objectWriter;
}
@@ -155,7 +153,7 @@ public class ObjectMapperFactory {
private static ObjectMapper createObjectMapperWithIncludeAlways() {
return MAPPER_REFERENCE
.get().getObjectMapper().copy()
- .setSerializationInclusion(Include.ALWAYS);
+ .setDefaultPropertyInclusion(Include.ALWAYS);
}
public static ObjectMapper create() {
@@ -170,7 +168,7 @@ public class ObjectMapperFactory {
// forward compatibility for the properties may go away in the future
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
- mapper.setSerializationInclusion(Include.NON_NULL);
+ mapper.setDefaultPropertyInclusion(Include.NON_NULL);
// enable Jackson Java 8 support modules
// https://github.com/FasterXML/jackson-modules-java8
@@ -271,7 +269,6 @@ public class ObjectMapperFactory {
/**
* Clears the caches tied to the ObjectMapper instances and replaces the
singleton ObjectMapper instance.
- *
* This can be used in tests to ensure that classloaders and class
references don't leak across tests.
*/
public static void clearCaches() {