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

mpochatkin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 21a3a806bf5 IGNITE-27811 Add support for Spring Data 4 (#7578)
21a3a806bf5 is described below

commit 21a3a806bf5c0380b7a4cb7f69ab4e77d46c7693
Author: Maksim Myskov <[email protected]>
AuthorDate: Thu Feb 19 14:59:50 2026 +0300

    IGNITE-27811 Add support for Spring Data 4 (#7578)
---
 gradle/libs.versions.toml                          |  8 +++
 modules/spring/spring-data-ignite/build.gradle     | 84 ++++++++++++++++++++++
 .../java/org/apache/ignite/data/IgniteDialect.java | 21 ++++--
 .../org/apache/ignite/data/SpringDataJdbcTest.java |  2 +
 4 files changed, 110 insertions(+), 5 deletions(-)

diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index d24e53ef9a3..1978fe7ecd5 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -35,6 +35,8 @@ jline = "3.29.0"
 jmh = "1.37"
 junit5 = "5.14.2"
 junit5-platform = "1.14.2"
+junit6 = "6.0.2"
+junit6-platform = "6.0.2"
 junitPioneer = "2.3.0"
 jsr305 = "3.0.2"
 okhttp = "5.3.2"
@@ -157,6 +159,11 @@ junit-testkit = { module = 
"org.junit.platform:junit-platform-testkit", version.
 # junit platform
 junit5-platform-console = { module = 
"org.junit.platform:junit-platform-console", version.ref = "junit5-platform" }
 
+#JUnit 6 (for Spring Boot 4.x modules)
+junit6-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = 
"junit6" }
+junit6-impl = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref 
= "junit6" }
+junit6-params = { module = "org.junit.jupiter:junit-jupiter-params", 
version.ref = "junit6" }
+
 #junit-pioneer
 junit-pioneer = { module = "org.junit-pioneer:junit-pioneer", version.ref = 
"junitPioneer" }
 
@@ -320,6 +327,7 @@ japicmp = { module = "com.github.siom79.japicmp:japicmp", 
version.ref = "japicmp
 
 [bundles]
 junit = ["junit5-api", "junit5-impl", "junit5-params", "junit-pioneer"]
+junit6 = ["junit6-api", "junit6-impl", "junit6-params", "junit-pioneer"]
 mockito = ["mockito-core", "mockito-junit"]
 hamcrest = ["hamcrest-core", "hamcrest-optional", "hamcrest-path"]
 log4j = ["jansi-core", "log4j-api", "log4j-core", "log4j-bridge", 
"slf4j-log4j"]
diff --git a/modules/spring/spring-data-ignite/build.gradle 
b/modules/spring/spring-data-ignite/build.gradle
index bcb62488001..10ccbc4d5b9 100644
--- a/modules/spring/spring-data-ignite/build.gradle
+++ b/modules/spring/spring-data-ignite/build.gradle
@@ -38,3 +38,87 @@ dependencies {
     testImplementation testFixtures(project(':ignite-runner'))
     testImplementation testFixtures(project(':ignite-core'))
 }
+
+// ========================================
+// Spring Data 4.0 Testing Support
+// ========================================
+
+// Create isolated configuration for Spring Data 4.0 testing
+configurations {
+    springData4Implementation {
+        canBeResolved = true
+        canBeConsumed = false
+    }
+    springData4RuntimeClasspath {
+        extendsFrom springData4Implementation
+        canBeResolved = true
+        canBeConsumed = false
+    }
+}
+
+configurations.springData4RuntimeClasspath {
+    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
+        if (details.requested.module.group == 'org.springframework.boot' ||
+            details.requested.module.group == 'org.springframework.data') {
+            if (details.requested.module.toString().contains('spring-boot')) {
+                details.useVersion '4.0.2'
+                details.because 'Testing against Spring Boot 4.0.2'
+            } else if 
(details.requested.module.toString().contains('spring-data')) {
+                details.useVersion '4.0.2'
+                details.because 'Testing against Spring Data 4.0.2'
+            }
+        }
+    }
+}
+
+// Spring Data 4.0 dependencies - completely separate from default
+dependencies {
+    springData4Implementation project(':ignite-client')
+    springData4Implementation project(":ignite-jdbc")
+
+    // Spring Boot 4.0.2 with Spring Data 4.0.2
+    springData4Implementation 
platform("org.springframework.boot:spring-boot-dependencies:4.0.2")
+    springData4Implementation 'org.springframework.boot:spring-boot'
+    springData4Implementation 
'org.springframework.boot:spring-boot-autoconfigure'
+    
springData4Implementation('org.springframework.boot:spring-boot-starter-data-jdbc')
 {
+        exclude group: 'org.springframework.boot', module: 
'spring-boot-starter-logging'
+        exclude group: 'ch.qos.logback', module: 'logback-classic'
+    }
+    springData4Implementation libs.bundles.junit6
+    springData4Implementation libs.assertj.core
+    springData4Implementation libs.bundles.log4j
+    springData4Implementation 'org.springframework.boot:spring-boot-test'
+    springData4Implementation testFixtures(project(':ignite-runner'))
+    springData4Implementation testFixtures(project(':ignite-core'))
+}
+
+// Test task for Spring Data 4.0
+tasks.register('testSpringData4', Test) {
+    description = 'Runs tests against Spring Data 4.0.2 (Spring Boot 4.0.2) 
with JUnit 6'
+    group = 'verification'
+
+    testClassesDirs = sourceSets.test.output.classesDirs
+    classpath = configurations.springData4Implementation + 
sourceSets.main.output + sourceSets.test.output
+
+    systemProperty 'spring.data.version', '4.0.2'
+    useJUnitPlatform()
+
+    // Add version info to test output
+    testLogging {
+        events "passed", "skipped", "failed"
+        displayGranularity 2
+    }
+}
+
+// Default test task uses Spring Data 3.5
+tasks.named('test') {
+    systemProperty 'spring.data.version', '3.5.5'
+
+    // Add version info to test output
+    testLogging {
+        events "passed", "skipped", "failed"
+        displayGranularity 2
+    }
+
+    finalizedBy testSpringData4
+}
diff --git 
a/modules/spring/spring-data-ignite/src/main/java/org/apache/ignite/data/IgniteDialect.java
 
b/modules/spring/spring-data-ignite/src/main/java/org/apache/ignite/data/IgniteDialect.java
index d5b9f27a2f2..29dd1b6a078 100644
--- 
a/modules/spring/spring-data-ignite/src/main/java/org/apache/ignite/data/IgniteDialect.java
+++ 
b/modules/spring/spring-data-ignite/src/main/java/org/apache/ignite/data/IgniteDialect.java
@@ -19,8 +19,9 @@ package org.apache.ignite.data;
 
 import java.util.Collections;
 import java.util.Set;
+import org.springframework.data.jdbc.core.dialect.JdbcArrayColumns;
+import org.springframework.data.jdbc.core.dialect.JdbcDialect;
 import org.springframework.data.relational.core.dialect.AbstractDialect;
-import org.springframework.data.relational.core.dialect.ArrayColumns;
 import org.springframework.data.relational.core.dialect.LimitClause;
 import org.springframework.data.relational.core.dialect.LockClause;
 import org.springframework.data.relational.core.sql.IdentifierProcessing;
@@ -33,7 +34,7 @@ import org.springframework.util.ClassUtils;
 /**
  * Implementation of Ignite-specific dialect.
  */
-public class IgniteDialect extends AbstractDialect {
+public class IgniteDialect extends AbstractDialect implements JdbcDialect {
 
     /**
      * Singleton instance.
@@ -64,7 +65,7 @@ public class IgniteDialect extends AbstractDialect {
         }
     };
 
-    static class IgniteArrayColumns implements ArrayColumns {
+    static class IgniteArrayColumns implements JdbcArrayColumns {
         @Override
         public boolean isSupported() {
             return true;
@@ -104,13 +105,23 @@ public class IgniteDialect extends AbstractDialect {
     private final IgniteArrayColumns arrayColumns = new IgniteArrayColumns();
 
     @Override
-    public ArrayColumns getArraySupport() {
+    public JdbcArrayColumns getArraySupport() {
         return arrayColumns;
     }
 
     @Override
     public IdentifierProcessing getIdentifierProcessing() {
-        return IdentifierProcessing.create(Quoting.ANSI, 
LetterCasing.UPPER_CASE);
+        return new IdentifierProcessing() {
+            @Override
+            public String quote(String identifier) {
+                return Quoting.ANSI.apply(identifier);
+            }
+
+            @Override
+            public String standardizeLetterCase(String identifier) {
+                return identifier.toUpperCase();
+            }
+        };
     }
 
     @Override
diff --git 
a/modules/spring/spring-data-ignite/src/test/java/org/apache/ignite/data/SpringDataJdbcTest.java
 
b/modules/spring/spring-data-ignite/src/test/java/org/apache/ignite/data/SpringDataJdbcTest.java
index c861f2611d4..7f048082833 100644
--- 
a/modules/spring/spring-data-ignite/src/test/java/org/apache/ignite/data/SpringDataJdbcTest.java
+++ 
b/modules/spring/spring-data-ignite/src/test/java/org/apache/ignite/data/SpringDataJdbcTest.java
@@ -40,6 +40,7 @@ import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayNameGeneration;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -70,6 +71,7 @@ import org.springframework.data.util.Streamable;
  */
 @SpringBootTest(classes = TestApplication.class)
 @ExtendWith(WorkDirectoryExtension.class)
+@DisplayNameGeneration(SpringDataVersionDisplayNameGenerator.class)
 public class SpringDataJdbcTest extends BaseIgniteAbstractTest {
 
     @WorkDirectory

Reply via email to