This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new ea59025ed1b Manage objenesis 3.6, add more Flink tests
ea59025ed1b is described below
commit ea59025ed1beded0c1408d778a49057b4325e086
Author: Peter Palaga <[email protected]>
AuthorDate: Tue Nov 10 15:46:13 2026 +0100
Manage objenesis 3.6, add more Flink tests
* flink: Add callback and serialization integration coverage
Preserve the original FlinkTest and FlinkResource unchanged. Add eight
complementary scenarios in separate data processing test and resource
classes: single and multiple callback payloads, annotated callbacks with
and without parameters, POJO aggregation, ordinary and annotated DataSet
sinks, and DataStream tuple transformation and collection.
Run the scenarios in Quarkus test mode.
Add flink-core-api to the parent-first artifacts to prevent classloader
constraint violations exposed by the new transformations.
Validation: the two original and eight new tests passed in Quarkus test
mode. Module formatting and diff checks passed; the original test and
resource remain byte-for-byte unchanged.
AI-generated by Codex on behalf of ppalaga-agent.
Co-authored-by: Codex <[email protected]>
* flink: Cover Objenesis constructor bypass through Camel
Add a DataSet collection scenario using a generic Kryo type without a
no-argument constructor. Execute the job through Camel and assert both
preserved field values and a transient flag proving constructor bypass.
Open java.util to Flink's Chill serializers in Quarkus tests and the
packaged JVM application. Keep the original tests unchanged.
Validation: all 11 scenarios passed in Quarkus and packaged JVM modes
(22 executions). Debugger breakpoints confirmed calls to Objenesis's
StdInstantiatorStrategy and SunReflectionFactoryInstantiator for the
new payload type. Formatting and diff checks passed.
AI-generated by Codex on behalf of ppalaga-agent.
Co-authored-by: Codex <[email protected]>
* Manage objenesis 3.6 to avoid CVE-2026-116486
---------
Co-authored-by: Peter Palaga's AI Agent <[email protected]>
Co-authored-by: Codex <[email protected]>
---
.github/dependabot.yml | 1 +
extensions-jvm/flink/runtime/pom.xml | 3 +-
integration-tests-jvm/flink/pom.xml | 45 +++-
.../flink/it/FlinkDataProcessingResource.java | 296 +++++++++++++++++++++
.../flink/it/FlinkDataProcessingTest.java | 94 +++++++
pom.xml | 1 +
poms/bom/pom.xml | 5 +
poms/bom/src/main/generated/flattened-full-pom.xml | 5 +
.../src/main/generated/flattened-reduced-pom.xml | 5 +
.../generated/flattened-reduced-verbose-pom.xml | 5 +
10 files changed, 458 insertions(+), 2 deletions(-)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 2f936377c34..4236cb15276 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -46,6 +46,7 @@ updates:
- dependency-name: "io.swagger.codegen.v3:swagger-codegen-generators"
- dependency-name: "org.amqphub.quarkus:quarkus-qpid-jms-bom"
- dependency-name: "org.apache.camel.kamelets:camel-kamelets"
+ - dependency-name: "org.objenesis:objenesis"
- dependency-name: "io.micrometer:micrometer-tracing"
- dependency-name: "org.jolokia:jolokia-agent-jvm"
- dependency-name: "com.auth0:java-jwt"
diff --git a/extensions-jvm/flink/runtime/pom.xml
b/extensions-jvm/flink/runtime/pom.xml
index 894057e03c7..27b3f1fba09 100644
--- a/extensions-jvm/flink/runtime/pom.xml
+++ b/extensions-jvm/flink/runtime/pom.xml
@@ -61,6 +61,7 @@
<parentFirstArtifact>org.apache.flink:flink-clients</parentFirstArtifact>
<parentFirstArtifact>org.apache.flink:flink-connector-datagen</parentFirstArtifact>
<parentFirstArtifact>org.apache.flink:flink-core</parentFirstArtifact>
+
<parentFirstArtifact>org.apache.flink:flink-core-api</parentFirstArtifact>
<parentFirstArtifact>org.apache.flink:flink-datastream</parentFirstArtifact>
<parentFirstArtifact>org.apache.flink:flink-datastream-api</parentFirstArtifact>
<parentFirstArtifact>org.apache.flink:flink-file-sink-common</parentFirstArtifact>
@@ -90,4 +91,4 @@
</plugin>
</plugins>
</build>
-</project>
\ No newline at end of file
+</project>
diff --git a/integration-tests-jvm/flink/pom.xml
b/integration-tests-jvm/flink/pom.xml
index 5efab5a7018..951ea18a032 100644
--- a/integration-tests-jvm/flink/pom.xml
+++ b/integration-tests-jvm/flink/pom.xml
@@ -30,6 +30,13 @@
<name>Camel Quarkus :: Integration Tests :: Flink</name>
<description>Integration tests for Camel Quarkus Flink
extension</description>
+ <properties>
+ <!-- Flink's Chill serializers reflectively access java.util when
initializing Kryo. -->
+
<flink.test.jvm-args>--add-opens=java.base/java.util=ALL-UNNAMED</flink.test.jvm-args>
+ <!-- Flink's local job classloader needs application classes and
dependencies on the system classpath. -->
+ <quarkus.package.jar.type>uber-jar</quarkus.package.jar.type>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
@@ -59,6 +66,42 @@
</dependencies>
<profiles>
+ <profile>
+ <id>full</id>
+ <activation>
+ <property>
+ <name>!quickly</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <argLine>@{argLine}
${flink.test.jvm-args}</argLine>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <configuration>
+ <systemPropertyVariables>
+ <quarkus.test.arg-line>${flink.test.jvm-args}
${fips.test.arg-line}</quarkus.test.arg-line>
+ </systemPropertyVariables>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
<profile>
<id>virtualDependencies</id>
<activation>
@@ -88,4 +131,4 @@
</profile>
</profiles>
-</project>
\ No newline at end of file
+</project>
diff --git
a/integration-tests-jvm/flink/src/main/java/org/apache/camel/quarkus/component/flink/it/FlinkDataProcessingResource.java
b/integration-tests-jvm/flink/src/main/java/org/apache/camel/quarkus/component/flink/it/FlinkDataProcessingResource.java
new file mode 100644
index 00000000000..d443a1e0d15
--- /dev/null
+++
b/integration-tests-jvm/flink/src/main/java/org/apache/camel/quarkus/component/flink/it/FlinkDataProcessingResource.java
@@ -0,0 +1,296 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.flink.it;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.BadRequestException;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.flink.DataSetCallback;
+import org.apache.camel.component.flink.DataStreamCallback;
+import org.apache.camel.component.flink.FlinkConstants;
+import org.apache.camel.component.flink.Flinks;
+import org.apache.camel.component.flink.VoidDataSetCallback;
+import org.apache.camel.component.flink.annotations.AnnotatedDataSetCallback;
+import org.apache.flink.api.common.RuntimeExecutionMode;
+import org.apache.flink.api.common.functions.FilterFunction;
+import org.apache.flink.api.common.functions.MapFunction;
+import org.apache.flink.api.common.functions.ReduceFunction;
+import org.apache.flink.api.java.DataSet;
+import org.apache.flink.api.java.ExecutionEnvironment;
+import org.apache.flink.api.java.tuple.Tuple2;
+import org.apache.flink.api.java.typeutils.GenericTypeInfo;
+import org.apache.flink.configuration.Configuration;
+import org.apache.flink.configuration.CoreOptions;
+import org.apache.flink.streaming.api.datastream.DataStream;
+import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
+import org.apache.flink.util.CloseableIterator;
+
+@Path("/flink/processing")
+@ApplicationScoped
+@Consumes(MediaType.TEXT_PLAIN)
+@Produces(MediaType.TEXT_PLAIN)
+public class FlinkDataProcessingResource {
+
+ @Inject
+ CamelContext context;
+
+ @Inject
+ ProducerTemplate template;
+
+ @POST
+ @Path("/dataset/callback/{callback}")
+ public String dataSet(@PathParam("callback") String callback,
@QueryParam("factor") List<Integer> factors, String text) {
+ DataSet<String> dataSet =
dataSetEnvironment().fromCollection(text.lines().toList());
+ Object payload = factors.isEmpty() ? null : factors.size() == 1 ?
factors.get(0) : factors;
+ DataSetCallback<?> dataSetCallback = switch (callback) {
+ case "payload" -> new CountLines();
+ case "annotated" -> new AnnotatedDataSetCallback(
+ factors.isEmpty() ? new AnnotatedCountLines() : new
MultiplyCount(), context);
+ default -> throw new BadRequestException("Unknown callback: " +
callback);
+ };
+ return template.requestBodyAndHeaders("flink:dataset", payload,
+ Map.of(FlinkConstants.FLINK_DATASET_HEADER, dataSet,
+ FlinkConstants.FLINK_DATASET_CALLBACK_HEADER,
dataSetCallback),
+ String.class);
+ }
+
+ @POST
+ @Path("/dataset/collect")
+ public String collectDataSet(String text) {
+ DataSet<String> dataSet =
dataSetEnvironment().fromCollection(text.lines().toList());
+ // Returning a DataSet makes Camel collect it, executing the job and
deserializing its POJO results.
+ DataSetCallback<DataSet<WordCount>> callback = (ds, payloads) -> {
+ DataSet<String> words = ds;
+ return words.map(new
ToWordCount()).rebalance().groupBy("word").reduce(new SumCounts());
+ };
+ List<WordCount> result =
template.requestBodyAndHeaders("flink:dataset", null,
+ Map.of(FlinkConstants.FLINK_DATASET_HEADER, dataSet,
+ FlinkConstants.FLINK_DATASET_CALLBACK_HEADER,
callback),
+ List.class);
+ return result.stream().map(word -> word.word + ":" +
word.count).sorted().collect(Collectors.joining(","));
+ }
+
+ @POST
+ @Path("/dataset/objenesis")
+ public String collectDataSetUsingObjenesis(String text) {
+ DataSet<String> dataSet =
dataSetEnvironment().fromCollection(text.lines().toList());
+ DataSetCallback<DataSet<ConstructorOnlyValue>> callback = (ds,
payloads) -> {
+ DataSet<String> words = ds;
+ // GenericTypeInfo selects Kryo; the missing no-arg constructor
requires its Objenesis fallback.
+ return words.map(new ToConstructorOnlyValue())
+ .returns(new
GenericTypeInfo<>(ConstructorOnlyValue.class)).rebalance();
+ };
+ List<ConstructorOnlyValue> result =
template.requestBodyAndHeaders("flink:dataset", null,
+ Map.of(FlinkConstants.FLINK_DATASET_HEADER, dataSet,
+ FlinkConstants.FLINK_DATASET_CALLBACK_HEADER,
callback),
+ List.class);
+ return result.stream().map(value -> value.word + ":" + value.length +
":" + value.constructorInvoked)
+ .sorted().collect(Collectors.joining(","));
+ }
+
+ @POST
+ @Path("/dataset/sink/{callback}")
+ public String dataSetSink(@PathParam("callback") String callback, String
text) throws Exception {
+ java.nio.file.Path directory =
Files.createTempDirectory(Paths.get("target"), "flink-output-");
+ java.nio.file.Path output = directory.resolve("result.txt");
+ try {
+ DataSet<String> dataSet =
dataSetEnvironment().fromCollection(text.lines().toList());
+ DataSetCallback<?> sink = switch (callback) {
+ case "void" -> new VoidDataSetCallback() {
+ @Override
+ public void doOnDataSet(DataSet ds, Object... payloads) {
+ writeDataSet(ds, (String) payloads[0]);
+ }
+ };
+ case "annotated" -> new AnnotatedDataSetCallback(new
AnnotatedSink());
+ default -> throw new BadRequestException("Unknown callback: " +
callback);
+ };
+ template.requestBodyAndHeaders("flink:dataset", output.toString(),
+ Map.of(FlinkConstants.FLINK_DATASET_HEADER, dataSet,
+ FlinkConstants.FLINK_DATASET_CALLBACK_HEADER,
sink));
+ return Files.readString(output);
+ } finally {
+ Files.deleteIfExists(output);
+ Files.deleteIfExists(directory);
+ }
+ }
+
+ @POST
+ @Path("/datastream/collect")
+ public String collectDataStream(String text) throws Exception {
+ try (StreamExecutionEnvironment env = streamEnvironment()) {
+ DataStream<String> stream = env.fromData(text.lines().toList());
+ DataStreamCallback<List<Tuple2<String, Integer>>> callback = (ds,
payloads) -> {
+ DataStream<String> words = ds;
+ DataStream<Tuple2<String, Integer>> transformed =
words.filter(new NonEmpty()).map(new ToTuple()).rebalance();
+ List<Tuple2<String, Integer>> values = new ArrayList<>();
+ try (CloseableIterator<Tuple2<String, Integer>> iterator =
transformed.executeAndCollect()) {
+ iterator.forEachRemaining(values::add);
+ }
+ return values;
+ };
+ List<Tuple2<String, Integer>> result =
template.requestBodyAndHeaders("flink:datastream", null,
+ Map.of(FlinkConstants.FLINK_DATASTREAM_HEADER, stream,
+ FlinkConstants.FLINK_DATASTREAM_CALLBACK_HEADER,
callback),
+ List.class);
+ return result.stream().map(tuple -> tuple.f0 + ":" +
tuple.f1).sorted().collect(Collectors.joining(","));
+ }
+ }
+
+ private static ExecutionEnvironment dataSetEnvironment() {
+ ExecutionEnvironment env = Flinks.createExecutionEnvironment();
+ env.getConfiguration().set(CoreOptions.TMP_DIRS, "target");
+ env.setParallelism(1);
+ return env;
+ }
+
+ private static StreamExecutionEnvironment streamEnvironment() {
+ Configuration configuration = new Configuration();
+ configuration.set(CoreOptions.TMP_DIRS, "target");
+ StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment(configuration);
+ env.setParallelism(1);
+ env.setRuntimeMode(RuntimeExecutionMode.BATCH);
+ return env;
+ }
+
+ private static void writeDataSet(DataSet<?> dataSet, String path) {
+ try {
+ dataSet.writeAsText(path);
+ dataSet.getExecutionEnvironment().execute("Camel DataSet sink");
+ } catch (Exception e) {
+ throw new RuntimeCamelException(e);
+ }
+ }
+
+ public static class CountLines implements DataSetCallback<Long> {
+ @Override
+ public Long onDataSet(DataSet ds, Object... payloads) {
+ try {
+ long result = ds.count();
+ for (Object payload : payloads) {
+ if (payload != null) {
+ result *= (Integer) payload;
+ }
+ }
+ return result;
+ } catch (Exception e) {
+ throw new RuntimeCamelException(e);
+ }
+ }
+ }
+
+ public static class AnnotatedCountLines {
+ @org.apache.camel.component.flink.annotations.DataSetCallback
+ public long count(DataSet<String> dataSet) throws Exception {
+ return dataSet.count();
+ }
+ }
+
+ public static class MultiplyCount {
+ @org.apache.camel.component.flink.annotations.DataSetCallback
+ public long count(DataSet<String> dataSet, int first, int second)
throws Exception {
+ return dataSet.count() * first * second;
+ }
+ }
+
+ public static class AnnotatedSink {
+ @org.apache.camel.component.flink.annotations.DataSetCallback
+ public void write(DataSet<String> dataSet, String path) {
+ writeDataSet(dataSet, path);
+ }
+ }
+
+ // Public fields and the no-arg constructor exercise Flink's reflective
POJO serializer.
+ public static class WordCount {
+ public String word;
+ public int count;
+
+ public WordCount() {
+ }
+
+ public WordCount(String word, int count) {
+ this.word = word;
+ this.count = count;
+ }
+ }
+
+ public static class ToWordCount implements MapFunction<String, WordCount> {
+ @Override
+ public WordCount map(String value) {
+ return new WordCount(value, 1);
+ }
+ }
+
+ public static class ConstructorOnlyValue {
+ private String word;
+ private int length;
+ // Kryo does not serialize this flag, so false on collection proves
the constructor was bypassed.
+ private transient boolean constructorInvoked;
+
+ public ConstructorOnlyValue(String word) {
+ this.word = word;
+ this.length = word.length();
+ this.constructorInvoked = true;
+ }
+ }
+
+ public static class ToConstructorOnlyValue implements MapFunction<String,
ConstructorOnlyValue> {
+ @Override
+ public ConstructorOnlyValue map(String value) {
+ return new ConstructorOnlyValue(value);
+ }
+ }
+
+ public static class SumCounts implements ReduceFunction<WordCount> {
+ @Override
+ public WordCount reduce(WordCount first, WordCount second) {
+ return new WordCount(first.word, first.count + second.count);
+ }
+ }
+
+ public static class NonEmpty implements FilterFunction<String> {
+ @Override
+ public boolean filter(String value) {
+ return !value.isBlank();
+ }
+ }
+
+ public static class ToTuple implements MapFunction<String, Tuple2<String,
Integer>> {
+ @Override
+ public Tuple2<String, Integer> map(String value) {
+ return Tuple2.of(value.toUpperCase(Locale.ROOT), value.length());
+ }
+ }
+}
diff --git
a/integration-tests-jvm/flink/src/test/java/org/apache/camel/quarkus/component/flink/it/FlinkDataProcessingTest.java
b/integration-tests-jvm/flink/src/test/java/org/apache/camel/quarkus/component/flink/it/FlinkDataProcessingTest.java
new file mode 100644
index 00000000000..562ca5cacfe
--- /dev/null
+++
b/integration-tests-jvm/flink/src/test/java/org/apache/camel/quarkus/component/flink/it/FlinkDataProcessingTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.flink.it;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.http.ContentType;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.is;
+
+@QuarkusTest
+class FlinkDataProcessingTest {
+
+ private static final String LINES = "foo\nbar\nbaz\nqux\nquux";
+
+ @Test
+ void dataSetCallbackWithSinglePayload() {
+ given().contentType(ContentType.TEXT).body(LINES).queryParam("factor",
10)
+ .post("/flink/processing/dataset/callback/payload")
+ .then().statusCode(200).body(is("50"));
+ }
+
+ @Test
+ void dataSetCallbackWithMultiplePayloads() {
+ given().contentType(ContentType.TEXT).body(LINES).queryParam("factor",
10, 20)
+ .post("/flink/processing/dataset/callback/payload")
+ .then().statusCode(200).body(is("1000"));
+ }
+
+ @Test
+ void annotatedDataSetCallback() {
+ given().contentType(ContentType.TEXT).body(LINES)
+ .post("/flink/processing/dataset/callback/annotated")
+ .then().statusCode(200).body(is("5"));
+ }
+
+ @Test
+ void annotatedDataSetCallbackWithParameters() {
+ given().contentType(ContentType.TEXT).body(LINES).queryParam("factor",
10, 20)
+ .post("/flink/processing/dataset/callback/annotated")
+ .then().statusCode(200).body(is("1000"));
+ }
+
+ @Test
+ void collectDataSetWithPojoSerialization() {
+ given().contentType(ContentType.TEXT).body("camel\nquarkus\ncamel")
+ .post("/flink/processing/dataset/collect")
+ .then().statusCode(200).body(is("camel:2,quarkus:1"));
+ }
+
+ @Test
+ void collectDataSetUsingObjenesis() {
+ given().contentType(ContentType.TEXT).body("camel\nquarkus")
+ .post("/flink/processing/dataset/objenesis")
+
.then().statusCode(200).body(is("camel:5:false,quarkus:7:false"));
+ }
+
+ @Test
+ void voidDataSetCallback() {
+ given().contentType(ContentType.TEXT).body(LINES)
+ .post("/flink/processing/dataset/sink/void")
+ .then().statusCode(200).body(is(LINES + "\n"));
+ }
+
+ @Test
+ void annotatedVoidDataSetCallback() {
+ given().contentType(ContentType.TEXT).body(LINES)
+ .post("/flink/processing/dataset/sink/annotated")
+ .then().statusCode(200).body(is(LINES + "\n"));
+ }
+
+ @Test
+ void collectDataStreamWithTupleSerialization() {
+ given().contentType(ContentType.TEXT).body("camel\n\nquarkus")
+ .post("/flink/processing/datastream/collect")
+ .then().statusCode(200).body(is("CAMEL:5,QUARKUS:7"));
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index abaa9605def..11a0ae56dd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,6 +161,7 @@
<mvel2.version>2.5.4.Final</mvel2.version><!-- @sync
org.apache.camel:camel-dependencies:${camel.version} prop:mvel-version -->
<mybatis.version>3.5.19</mybatis.version><!-- @sync
io.quarkiverse.mybatis:quarkus-parent:${quarkiverse-mybatis.version}
prop:mybatis.version -->
<oak-jackrabbit-api.version>2.2.0</oak-jackrabbit-api.version><!--
@sync org.apache.jackrabbit:jackrabbit-parent:${jackrabbit-version}
prop:oak-jackrabbit-api.version.implemented -->
+ <objenesis.version>3.6</objenesis.version><!-- Transitive of Flink,
Redis and Mockito -->
<okhttp.version>4.12.1</okhttp.version>
<okhttp-jvm.version>5.2.1</okhttp-jvm.version>
<okio.version>3.16.1</okio.version><!-- @sync
com.squareup.okhttp3:okhttp-jvm:${okhttp-jvm.version}
dep:com.squareup.okio:okio-jvm-->
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index 0d47c7f3038..da8b74c8a72 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -8351,6 +8351,11 @@
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.objenesis</groupId>
+ <artifactId>objenesis</artifactId>
+ <version>${objenesis.version}</version>
+ </dependency>
<dependency>
<groupId>org.opensearch.client</groupId>
<artifactId>opensearch-rest-client</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-full-pom.xml
b/poms/bom/src/main/generated/flattened-full-pom.xml
index dd23ddf82b8..aa814554d4e 100644
--- a/poms/bom/src/main/generated/flattened-full-pom.xml
+++ b/poms/bom/src/main/generated/flattened-full-pom.xml
@@ -8253,6 +8253,11 @@
<artifactId>mybatis</artifactId>
<version>3.5.19</version>
</dependency>
+ <dependency>
+ <groupId>org.objenesis</groupId>
+ <artifactId>objenesis</artifactId>
+ <version>3.6</version>
+ </dependency>
<dependency>
<groupId>org.opensearch.client</groupId>
<artifactId>opensearch-rest-client</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-reduced-pom.xml
b/poms/bom/src/main/generated/flattened-reduced-pom.xml
index 27bd63c12a6..ca1a6572bda 100644
--- a/poms/bom/src/main/generated/flattened-reduced-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-pom.xml
@@ -9304,6 +9304,11 @@
<artifactId>mybatis</artifactId>
<version>3.5.19</version>
</dependency>
+ <dependency>
+ <groupId>org.objenesis</groupId>
+ <artifactId>objenesis</artifactId>
+ <version>3.6</version>
+ </dependency>
<dependency>
<groupId>org.opensaml</groupId>
<artifactId>opensaml-core-api</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
index 5832fcc2517..41766b075a8 100644
--- a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
@@ -9304,6 +9304,11 @@
<artifactId>mybatis</artifactId>
<version>3.5.19</version>
</dependency>
+ <dependency>
+ <groupId>org.objenesis</groupId>
+ <artifactId>objenesis</artifactId>
+ <version>3.6</version>
+ </dependency>
<dependency>
<groupId>org.opensaml</groupId>
<artifactId>opensaml-core-api</artifactId>