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

gitgabrio pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new a37cfec845 [incubator-kie-issues#2288] - Springboot 4.0.x upgrade  
(#6686)
a37cfec845 is described below

commit a37cfec845c83311201047359f4001295dafa792
Author: Nithin R Krishnan <[email protected]>
AuthorDate: Mon May 18 14:05:32 2026 +0530

    [incubator-kie-issues#2288] - Springboot 4.0.x upgrade  (#6686)
    
    * Update dependency versions to align with the spring boot 4.0.x upgrade
    
    * Add infinispan-commons-spi dependency to avoid class duplication issues
    
    * Add infinispan-commons-spi dependency to resolve class duplication issues
    
    * Replace Jackson2ObjectMapperBuilderCustomizer in ruleunits 
RestObjectMapperSpringTemplate for Spring Boot 4
    
    * Update okhttp3 dependency version to 4.12.0 in pom.xml
    
    * Add custom MappingJackson2HttpMessageConverter for Spring Boot 4 
compatibility
    
    * Update RestObjectMapperSpringTemplate.java for Jackson 3 migration 
preparation
    
    * chore: retrigger CI
    
    * refactor: remove deprecated lz4-java dependency and its exclusions
    
    * refactor: unify JUnit version properties for consistency
    
    * refactor: update TODO for Jackson 3 migration and adjust canWrite logic 
in MappingJackson2HttpMessageConverter
    
    * refactor: update TODO comments for Jackson 2 configuration in 
RestObjectMapperSpringTemplate
    
    * refactor: update JUnit version properties and enhance Jackson 2 
configuration comments for migration clarity
    
    * refactor: standardize JUnit version property naming in pom.xml
    
    * refactor: synchronize trait class builder factory mode handling in 
AbstractTraitFactory
    
    * refactor: clarify JUnit 6 version property comment in pom.xml
    
    * ci: retrigger
    
    * netty patch version matching cve
    
    * ci: retrigger
---
 build-parent/pom.xml                               | 47 ++++++++++------------
 .../ruleunits/RestObjectMapperSpringTemplate.java  | 40 +++++++++++-------
 .../drools-reliability-infinispan/pom.xml          | 10 +++++
 .../drools-reliability-tests/pom.xml               | 10 +++++
 .../core/factmodel/AbstractTraitFactory.java       | 14 +++++--
 5 files changed, 78 insertions(+), 43 deletions(-)

diff --git a/build-parent/pom.xml b/build-parent/pom.xml
index 216d81e433..89ab809ff0 100644
--- a/build-parent/pom.xml
+++ b/build-parent/pom.xml
@@ -51,26 +51,26 @@
       - A version property must be specified in the format 
"version.{groupId}", optionally with a suffix to make it unique.
       - Version properties must be sorted alphabetically (other form of 
sorting were found to be unclear and ambiguous).
     -->
-    <version.ch.qos.logback>1.5.25</version.ch.qos.logback>
+    <version.ch.qos.logback>1.5.32</version.ch.qos.logback>
     <version.commons-codec>1.19.0</version.commons-codec>
     <version.commons-collections>3.2.2</version.commons-collections>
     <version.commons-logging>1.1.1</version.commons-logging>
     <version.commons-io>2.20.0</version.commons-io>
     <version.common-text>1.14.0</version.common-text>
-    <version.com.fasterxml.jackson>2.21.1</version.com.fasterxml.jackson>
-    
<version.com.fasterxml.jackson.databind>2.21.1</version.com.fasterxml.jackson.databind>
+    <version.com.fasterxml.jackson>2.21.2</version.com.fasterxml.jackson>
+    
<version.com.fasterxml.jackson.databind>2.21.2</version.com.fasterxml.jackson.databind>
     
<version.com.fasterxml.jackson.annotations>2.21</version.com.fasterxml.jackson.annotations>
     <version.com.github.victools>4.37.0</version.com.github.victools> <!-- 
victools should align with Jackson if possible -->
     <version.com.miglayout>3.7.4</version.com.miglayout>
     <version.domino-slf4j-logger>1.0.1</version.domino-slf4j-logger>
     <version.com.google.protobuf>3.25.5</version.com.google.protobuf>
-    <version.com.h2database>2.3.232</version.com.h2database>
+    <version.com.h2database>2.4.240</version.com.h2database>
     
<version.com.networknt.json-schema-validator>1.0.86</version.com.networknt.json-schema-validator>
     <version.com.sun.xml.bind>4.0.5</version.com.sun.xml.bind>
     <version.com.thoughtworks.xstream>1.4.21</version.com.thoughtworks.xstream>
     <version.guru.nidi>0.18.0</version.guru.nidi>
     <version.info.picocli>4.7.7</version.info.picocli>
-    <version.io.micrometer>1.14.12</version.io.micrometer>
+    <version.io.micrometer>1.16.4</version.io.micrometer>
     <version.io.quarkus>3.27.3</version.io.quarkus>
     <version.io.netty>4.1.133.Final</version.io.netty>
     <version.io.smallrye.openapi.core>4.0.12</version.io.smallrye.openapi.core>
@@ -78,13 +78,15 @@
     <version.org.apache.kafka>4.1.2</version.org.apache.kafka>
 
     <version.it.unimi.dsi.fastutil>8.5.11</version.it.unimi.dsi.fastutil>
+    <!-- JUnit 4 API for legacy test classes that still use org.junit.* 
annotations.
+         junit-vintage-engine (part of JUnit 6, see version.org.junit) runs 
them on the JUnit Platform. -->
     <version.junit>4.13.2</version.junit>
     <version.net.java.dev.glazedlists>1.8.0</version.net.java.dev.glazedlists>
     <version.antlr>2.7.7</version.antlr>
     <version.org.antlr>3.5.2</version.org.antlr>
     <version.org.antlr.ST4>4.0.7</version.org.antlr.ST4>
     <version.org.apache.ant>1.10.11</version.org.apache.ant>
-    <version.org.apache.commons.lang3>3.18.0</version.org.apache.commons.lang3>
+    <version.org.apache.commons.lang3>3.19.0</version.org.apache.commons.lang3>
     <version.org.apache.commons.math3>3.6.1</version.org.apache.commons.math3>
     
<version.org.apache.httpcomponents.httpcore>4.4.16</version.org.apache.httpcomponents.httpcore>
     <version.org.apache.maven>3.9.11</version.org.apache.maven>
@@ -98,9 +100,9 @@
     <version.org.freemarker>2.3.34</version.org.freemarker>
     <version.org.glassfish.jaxb>4.0.6</version.org.glassfish.jaxb>
     <!--This needs to be in sync with JUnit-->
-    <version.org.hamcrest>2.2</version.org.hamcrest>
+    <version.org.hamcrest>3.0</version.org.hamcrest>
     <version.org.hsqldb>2.7.1</version.org.hsqldb>
-    <version.org.infinispan>15.0.21.Final</version.org.infinispan>
+    <version.org.infinispan>15.2.6.Final</version.org.infinispan>
     
<version.org.infinispan.protostream>5.0.13.Final</version.org.infinispan.protostream>
     <version.org.javassist>3.26.0-GA</version.org.javassist>
     
<version.org.jboss.narayana.tomcat>7.2.2.Final</version.org.jboss.narayana.tomcat>
@@ -121,15 +123,15 @@
     <version.jakarta.json-api>2.1.3</version.jakarta.json-api>
     <version.org.apache.openjpa>4.0.0</version.org.apache.openjpa>
     <version.org.jpmml.model>1.6.4</version.org.jpmml.model> <!-- jpmml-model 
BSD 3C license - ATTENTION 1.5.1 intentional, because 1.5.1 evaluators works 
with 1.5.1 -->
-    <version.org.junit.jupiter>5.13.4</version.org.junit.jupiter>
-    <version.org.junit.platform>1.13.4</version.org.junit.platform> <!-- Keep 
synchronized with junit-jupiter (middle and minor should be the same) -->
+      <!-- JUnit 6: single version property for jupiter + platform + vintage 
artifacts. See version.junit above for the legacy JUnit 4 API. -->
+    <version.org.junit>6.0.3</version.org.junit>
     <version.org.mvel>2.5.2.Final</version.org.mvel>
     <version.org.powermock>2.0.9</version.org.powermock>
     <version.org.slf4j>2.0.17</version.org.slf4j>
     <!-- simple-jndi is a small library that helps us avoid JNDI error 
messages during testing -->
     <version.simple-jndi>0.11.4.1</version.simple-jndi>
     <version.xerces>2.12.0.SP04</version.xerces>
-    <version.com.squareup.okhttp3>4.9.2</version.com.squareup.okhttp3>
+    <version.com.squareup.okhttp3>4.12.0</version.com.squareup.okhttp3>
 
     <!-- External dependency versions bom -->
     <!-- 
################################################################################
 -->
@@ -647,42 +649,42 @@
       <dependency>
         <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter-api</artifactId>
-        <version>${version.org.junit.jupiter}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter</artifactId>
-        <version>${version.org.junit.jupiter}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter-engine</artifactId>
-        <version>${version.org.junit.jupiter}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter-params</artifactId>
-        <version>${version.org.junit.jupiter}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.vintage</groupId>
         <artifactId>junit-vintage-engine</artifactId>
-        <version>${version.org.junit.jupiter}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.platform</groupId>
         <artifactId>junit-platform-commons</artifactId>
-        <version>${version.org.junit.platform}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.platform</groupId>
         <artifactId>junit-platform-engine</artifactId>
-        <version>${version.org.junit.platform}</version>
+        <version>${version.org.junit}</version>
       </dependency>
       <dependency>
         <groupId>org.junit.platform</groupId>
         <artifactId>junit-platform-launcher</artifactId>
-        <version>${version.org.junit.platform}</version>
+        <version>${version.org.junit}</version>
       </dependency>
 
       <dependency>
@@ -1334,13 +1336,6 @@
         <groupId>org.apache.kafka</groupId>
         <artifactId>kafka-clients</artifactId>
         <version>${version.org.apache.kafka}</version>
-        <exclusions>
-          <!-- Exclude old org.lz4 to avoid duplicate classes with at.yawk.lz4 
-->
-          <exclusion>
-            <groupId>org.lz4</groupId>
-            <artifactId>lz4-java</artifactId>
-          </exclusion>
-        </exclusions>
       </dependency>
     </dependencies>
 
diff --git 
a/drools-model/drools-model-codegen/src/main/resources/class-templates/ruleunits/RestObjectMapperSpringTemplate.java
 
b/drools-model/drools-model-codegen/src/main/resources/class-templates/ruleunits/RestObjectMapperSpringTemplate.java
index dd479555b5..23e5a4a7a5 100644
--- 
a/drools-model/drools-model-codegen/src/main/resources/class-templates/ruleunits/RestObjectMapperSpringTemplate.java
+++ 
b/drools-model/drools-model-codegen/src/main/resources/class-templates/ruleunits/RestObjectMapperSpringTemplate.java
@@ -18,19 +18,18 @@
  */
 package $Package$;
 
-import java.util.List;
-
 import java.io.IOException;
 import java.util.List;
 
-import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.BeanProperty;
 import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.type.CollectionType;
 
 import org.drools.ruleunits.api.DataSource;
@@ -38,23 +37,36 @@ import org.drools.ruleunits.api.DataStore;
 import org.drools.ruleunits.api.DataStream;
 import org.drools.ruleunits.api.SingletonStore;
 
-import 
org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
 import org.springframework.boot.SpringBootConfiguration;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+import org.springframework.http.MediaType;
+import 
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 
+// Jackson 2 Spring configuration — remove together with 
https://github.com/apache/incubator-kie-drools/issues/6702 (Jackson 3 
migration).
 @SpringBootConfiguration
 public class RestObjectMapper {
 
+    public RestObjectMapper(ObjectMapper objectMapper) {
+        SimpleModule module = new SimpleModule();
+        module.addDeserializer(DataStream.class, new DataStreamDeserializer());
+        module.addDeserializer(DataStore.class, new DataStoreDeserializer());
+        module.addDeserializer(SingletonStore.class, new 
SingletonStoreDeserializer());
+        objectMapper.registerModule(module);
+    }
+
+    // Jackson 2 HTTP message converter — remove together with 
https://github.com/apache/incubator-kie-drools/issues/6702 (Jackson 3 
migration).
     @Bean
-    public Jackson2ObjectMapperBuilderCustomizer customizeObjectMapper() {
-        return new Jackson2ObjectMapperBuilderCustomizer() {
+    @ConditionalOnMissingBean(MappingJackson2HttpMessageConverter.class)
+    public MappingJackson2HttpMessageConverter 
mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
+        return new MappingJackson2HttpMessageConverter(objectMapper) {
             @Override
-            public void customize(Jackson2ObjectMapperBuilder builder) {
-                //addDefaultDeserializers
-                builder.deserializerByType(DataStream.class, new 
DataStreamDeserializer());
-                builder.deserializerByType(DataStore.class, new 
DataStoreDeserializer());
-                builder.deserializerByType(SingletonStore.class, new 
SingletonStoreDeserializer());
+            public boolean canWrite(Class<?> clazz, MediaType mediaType) {
+                // Refuse String so DMN controllers' pre-serialized JSON 
passes through StringHttpMessageConverter.
+                if (clazz == String.class) {
+                    return false;
+                }
+                return super.canWrite(clazz, mediaType);
             }
         };
     }
@@ -120,4 +132,4 @@ public class RestObjectMapper {
             return deserializer;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/drools-reliability/drools-reliability-infinispan/pom.xml 
b/drools-reliability/drools-reliability-infinispan/pom.xml
index b63c8b2e97..3cd4f2b5b4 100644
--- a/drools-reliability/drools-reliability-infinispan/pom.xml
+++ b/drools-reliability/drools-reliability-infinispan/pom.xml
@@ -93,6 +93,16 @@
                         <ignoreClass>org.infinispan.*</ignoreClass>
                       </ignoreClasses>
                     </dependency>
+                    <dependency>
+                      <!-- Upstream packaging duplicates these SPI classes 
between commons and commons-spi at 15.2.6.Final; bytes are identical. -->
+                      <groupId>org.infinispan</groupId>
+                      <artifactId>infinispan-commons-spi</artifactId>
+                      <type>jar</type>
+                      <ignoreClasses>
+                        
<ignoreClass>org.infinispan.commons.spi.OffHeapMemory</ignoreClass>
+                        
<ignoreClass>org.infinispan.commons.spi.ThreadCreator</ignoreClass>
+                      </ignoreClasses>
+                    </dependency>
                   </dependencies>
                 </banDuplicateClasses>
               </rules>
diff --git a/drools-reliability/drools-reliability-tests/pom.xml 
b/drools-reliability/drools-reliability-tests/pom.xml
index 6c88e19cf8..4ed09efd17 100644
--- a/drools-reliability/drools-reliability-tests/pom.xml
+++ b/drools-reliability/drools-reliability-tests/pom.xml
@@ -199,6 +199,16 @@
                         <ignoreClass>org.infinispan.*</ignoreClass>
                       </ignoreClasses>
                     </dependency>
+                    <dependency>
+                      <!-- Upstream packaging duplicates these SPI classes 
between commons and commons-spi at 15.2.6.Final; bytes are identical. -->
+                      <groupId>org.infinispan</groupId>
+                      <artifactId>infinispan-commons-spi</artifactId>
+                      <type>jar</type>
+                      <ignoreClasses>
+                        
<ignoreClass>org.infinispan.commons.spi.OffHeapMemory</ignoreClass>
+                        
<ignoreClass>org.infinispan.commons.spi.ThreadCreator</ignoreClass>
+                      </ignoreClasses>
+                    </dependency>
                   </dependencies>
                 </banDuplicateClasses>
               </rules>
diff --git 
a/drools-traits/src/main/java/org/drools/traits/core/factmodel/AbstractTraitFactory.java
 
b/drools-traits/src/main/java/org/drools/traits/core/factmodel/AbstractTraitFactory.java
index f20de7e9d5..8376309f36 100644
--- 
a/drools-traits/src/main/java/org/drools/traits/core/factmodel/AbstractTraitFactory.java
+++ 
b/drools-traits/src/main/java/org/drools/traits/core/factmodel/AbstractTraitFactory.java
@@ -74,9 +74,13 @@ public abstract class AbstractTraitFactory<T extends 
Thing<K>, K extends Traitab
     protected static void setMode(VirtualPropertyMode newMode, 
InternalRuleBase kBase, RuntimeComponentFactory rcf) {
         TraitFactoryImpl traitFactory = (TraitFactoryImpl) 
rcf.getTraitFactory(kBase);
         traitFactory.mode = newMode;
-        switch (newMode) {
+        syncBuilderFactoryWithMode(newMode);
+    }
+
+    private static synchronized void 
syncBuilderFactoryWithMode(VirtualPropertyMode mode) {
+        switch (mode) {
             case MAP:
-                if (!(traitClassBuilderFactory.getPropertyWrapperBuilder() 
instanceof TraitMapProxyClassBuilderImpl)) {
+                if (!(traitClassBuilderFactory.getPropertyWrapperBuilder() 
instanceof TraitMapPropertyWrapperClassBuilderImpl)) {
                     traitClassBuilderFactory.setPropertyWrapperBuilder(new 
TraitMapPropertyWrapperClassBuilderImpl());
                 }
                 if (!(traitClassBuilderFactory.getTraitProxyBuilder() 
instanceof TraitMapProxyClassBuilderImpl)) {
@@ -92,7 +96,7 @@ public abstract class AbstractTraitFactory<T extends 
Thing<K>, K extends Traitab
                 }
                 break;
             default:
-                throw new RuntimeException(" This should not happen : 
unexpected property wrapping method " + newMode);
+                throw new RuntimeException(" This should not happen : 
unexpected property wrapping method " + mode);
         }
     }
 
@@ -194,6 +198,10 @@ public abstract class AbstractTraitFactory<T extends 
Thing<K>, K extends Traitab
     }
 
     protected Class<T> buildProxyClass(K core, Class<?> trait) {
+        // The trait class builder factory is static and may have been left in 
a different
+        // VirtualPropertyMode by an earlier call. Re-sync it to this 
factory's mode so the
+        // generated proxy class has constructors that match the lookup in 
cacheConstructor.
+        syncBuilderFactoryWithMode(mode);
 
         Class coreKlass = core.getClass();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to