This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch 3.40.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/3.40.x by this push:
new 49b372b5bc8 [3.40.x] Manage objenesis 3.6, add more Flink tests
49b372b5bc8 is described below
commit 49b372b5bc803919dd967e0d29b5ffcbbd7b14ad
Author: Peter Palaga <[email protected]>
AuthorDate: Tue Nov 10 15:47:21 2026 +0100
[3.40.x] 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 683983f8b5d..18e9ae8432e 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"
# Test dependencies
diff --git a/extensions-jvm/flink/runtime/pom.xml
b/extensions-jvm/flink/runtime/pom.xml
index 6e7a97ea7ce..75483f0aa5b 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 5913cb8ea61..cbaf0411f9a 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 e212a56d1e3..183301148e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -159,6 +159,7 @@
<mvel2.version>2.5.2.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>1.88.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.0</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 e6db812b64d..8245aa8f255 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -8545,6 +8545,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 f9219d7f49b..3ca54373e35 100644
--- a/poms/bom/src/main/generated/flattened-full-pom.xml
+++ b/poms/bom/src/main/generated/flattened-full-pom.xml
@@ -8427,6 +8427,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 bccdeefa4b1..3671595d7ff 100644
--- a/poms/bom/src/main/generated/flattened-reduced-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-pom.xml
@@ -9463,6 +9463,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 257a664f929..43d410b7bed 100644
--- a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
@@ -9463,6 +9463,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>