Skip to content

ClassNotFoundException is thrown when loading JdbcSqlServerDialect #2153

@philwebb

Description

@philwebb

The fix for Issue #2147 means that calling org.springframework.boot.data.jdbc.autoconfigure.DataJdbcDatabaseDialect.values() fails with a ClassNotFoundException. This means that Spring Boot can no longer bind correctly:

 Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.data.jdbc.dialect' to org.springframework.boot.data.jdbc.autoconfigure.DataJdbcDatabaseDialect	at org.springframework.boot.context.properties.bind.Binder.handleBindError(Binder.java:418)	at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:377)	at org.springframework.boot.context.properties.bind.Binder.lambda$5(Binder.java:505)	at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:127)	at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:115)	at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:71)	at org.springframework.boot.context.properties.bind.Binder.lambda$7(Binder.java:508)	at org.springframework.boot.context.properties.bind.Binder.fromDataObjectBinders(Binder.java:517)	at org.springframework.boot.context.properties.bind.Binder.lambda$6(Binder.java:507)	at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:632)	at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:618)	at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:509)	at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:445)	at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:373)	at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:360)	at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:287)	at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:274)	at org.springframework.boot.context.properties.ConfigurationPropertiesBinder.bind(ConfigurationPropertiesBinder.java:96)	at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.bind(ConfigurationPropertiesBindingPostProcessor.java:101)	... 146 more Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [org.springframework.boot.data.jdbc.autoconfigure.DataJdbcDatabaseDialect] for value [postgresql]	at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:47)	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:181)	at org.springframework.boot.context.properties.bind.BindConverter.convert(BindConverter.java:113)	at org.springframework.boot.context.properties.bind.BindConverter.convert(BindConverter.java:104)	at org.springframework.boot.context.properties.bind.BindConverter.convert(BindConverter.java:96)	at org.springframework.boot.context.properties.bind.Binder.bindProperty(Binder.java:491)	at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:434)	at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:373)	... 163 more Caused by: java.lang.NoClassDefFoundError: microsoft/sql/DateTimeOffset	at org.springframework.data.jdbc.core.dialect.JdbcSqlServerDialect.<clinit>(JdbcSqlServerDialect.java:44)	at org.springframework.boot.data.jdbc.autoconfigure.DataJdbcDatabaseDialect.<clinit>(DataJdbcDatabaseDialect.java:82)	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)	at java.base/java.lang.reflect.Method.invoke(Method.java:569)	at java.base/java.lang.Class.getEnumConstantsShared(Class.java:3838)	at java.base/java.lang.Class.enumConstantDirectory(Class.java:3860)	at java.base/java.lang.Enum.valueOf(Enum.java:267)	at org.springframework.boot.convert.LenientObjectToEnumConverterFactory$LenientToEnumConverter.convert(LenientObjectToEnumConverterFactory.java:79)	at org.springframework.boot.convert.LenientObjectToEnumConverterFactory$LenientToEnumConverter.convert(LenientObjectToEnumConverterFactory.java:1)	at org.springframework.core.convert.support.GenericConversionService$ConverterFactoryAdapter.convert(GenericConversionService.java:406)	at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)	... 170 more Caused by: java.lang.ClassNotFoundException: microsoft.sql.DateTimeOffset	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)	... 183 more 

I think that DataJdbcDatabaseDialect should either be updated to lazily obtain the Dialect, or JdbcSqlServerDialect.SIMPLE_TYPES should be moved to the simpleTypes() method.

Metadata

Metadata

Assignees

Labels

type: regressionA regression from a previous release

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions