From ed7844cd30dcf62989d84b1ec4f44ea96beec265 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 8 Oct 2025 22:10:51 +0200 Subject: [PATCH] Guard `JdbcSqlServerDialect` against absence of SQL Server JDBC driver. Check for presence of microsoft.sql.DateTimeOffset class before returning it as type and associated converters. Closes #2153 --- .../core/dialect/JdbcSqlServerDialect.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java index 438e06630..b423d62e8 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java @@ -24,9 +24,12 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import org.jspecify.annotations.Nullable; + import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; import org.springframework.data.relational.core.dialect.SqlServerDialect; +import org.springframework.data.util.ClassUtils; /** * {@link SqlServerDialect} that registers JDBC specific converters. @@ -41,7 +44,21 @@ public class JdbcSqlServerDialect extends SqlServerDialect implements JdbcDialec public static final JdbcSqlServerDialect INSTANCE = new JdbcSqlServerDialect(); - private static final Set> SIMPLE_TYPES = Set.of(DateTimeOffset.class); + private static final @Nullable Class DATE_TIME_OFFSET_CLASS = ClassUtils + .loadIfPresent("microsoft.sql.DateTimeOffset", JdbcSqlServerDialect.class.getClassLoader()); + private static final Set> SIMPLE_TYPES; + private static final List CONVERTERS; + + static { + + if (DATE_TIME_OFFSET_CLASS != null) { + SIMPLE_TYPES = Set.of(DATE_TIME_OFFSET_CLASS); + CONVERTERS = List.of(DateTimeOffsetToOffsetDateTimeConverter.INSTANCE, DateTimeOffsetToInstantConverter.INSTANCE); + } else { + SIMPLE_TYPES = Set.of(); + CONVERTERS = List.of(); + } + } @Override public Set> simpleTypes() { @@ -52,8 +69,7 @@ public class JdbcSqlServerDialect extends SqlServerDialect implements JdbcDialec public Collection getConverters() { List converters = new ArrayList<>(super.getConverters()); - converters.add(DateTimeOffsetToOffsetDateTimeConverter.INSTANCE); - converters.add(DateTimeOffsetToInstantConverter.INSTANCE); + converters.addAll(CONVERTERS); return converters; }