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