spring boot 2.3.0.RELEASE 中的新错误:Oracle 12.2.0.1 jdbcdriver 的 UnsatisfiedDependencyException 但与 mysql

Posted

技术标签:

【中文标题】spring boot 2.3.0.RELEASE 中的新错误:Oracle 12.2.0.1 jdbcdriver 的 UnsatisfiedDependencyException 但与 mysql jdbcdriver 无关【英文标题】:New Error in spring boot 2.3.0.RELEASE : UnsatisfiedDependencyException for Oracle 12.2.0.1 jdbcdriver but not with mysql jdbcdriver 【发布时间】:2020-09-11 22:30:24 【问题描述】:

创建了一个新的启动项目,仅使用 jdbc 和 Oracle jdbc 作为依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>12.2.0.1</version>
    </dependency>

我在 application.properties 文件中配置数据源并运行这个简单的应用程序,它会在下面的堆栈跟踪中爆炸。

2020-05-25 15:07:16.769 警告 11840 --- [主要] s.c.a.AnnotationConfigApplicationContext : 遇到异常 在上下文初始化期间 - 取消刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 在类路径中定义名称为“jdbcConverter”的 bean 创建错误 资源 [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: 通过方法'jdbcConverter'表达的不满足的依赖关系 参数4;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建在类路径资源中定义的名称为“jdbcDialect”的 bean [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.data.relational.core.dialect.Dialect]:工厂 方法“jdbcDialect”抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: 无法确定方言 org.springframework.jdbc.core.JdbcTemplate@7fe083b1。请提供一个 方言。 2020-05-25 15:07:16.769 信息 11840 --- [主要] com.zaxxer.hikari.HikariDataSource:HikariPool-1 - 关闭 发起... 2020-05-25 15:07:17.023 INFO 11840 --- [主要] com.zaxxer.hikari.HikariDataSource:HikariPool-1 - 关闭 完全的。 2020-05-25 15:07:17.028 信息 11840 --- [主要] ConditionEvaluationReportLoggingListener:

启动 ApplicationContext 时出错。显示条件报告 在启用“调试”的情况下重新运行您的应用程序。 2020-05-25 15:07:17.035 错误 11840 --- [主] os.boot.SpringApplication : 应用程序运行失败

org.springframework.beans.factory.UnsatisfiedDependencyException: 在类路径中定义名称为“jdbcConverter”的 bean 创建错误 资源 [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: 通过方法'jdbcConverter'表达的不满足的依赖关系 参数4;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建在类路径资源中定义的名称为“jdbcDialect”的 bean [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.data.relational.core.dialect.Dialect]:工厂 方法“jdbcDialect”抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: 无法确定方言 org.springframework.jdbc.core.JdbcTemplate@7fe083b1。请提供一个 方言。在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:539) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:895) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 net.sincera.dbmigration.liquibasedemo.LiquibasedemoApplication.main(LiquibasedemoApplication.java:21) [classes/:na] 由以下原因引起: org.springframework.beans.factory.BeanCreationException:错误 创建在类路径资源中定义的名称为“jdbcDialect”的 bean [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.data.relational.core.dialect.Dialect]:工厂 方法“jdbcDialect”抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: 无法确定方言 org.springframework.jdbc.core.JdbcTemplate@7fe083b1。请提供一个 方言。在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1306) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1226) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] ... 19个常用框架 省略原因: org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.data.relational.core.dialect.Dialect]:工厂 方法“jdbcDialect”抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: 无法确定方言 org.springframework.jdbc.core.JdbcTemplate@7fe083b1。请提供一个 方言。在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] ... 33个常用框架 省略原因: org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: 无法确定方言 org.springframework.jdbc.core.JdbcTemplate@7fe083b1。请提供一个 方言。在 org.springframework.data.jdbc.repository.config.DialectResolver.lambda$getDialect$2(DialectResolver.java:76) ~[spring-data-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE] 在 java.util.Optional.orElseThrow(Optional.java:290) ~[na:1.8.0_241] 在 org.springframework.data.jdbc.repository.config.DialectResolver.getDialect(DialectResolver.java:75) ~[spring-data-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE] 在 org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration.jdbcDialect(AbstractJdbcConfiguration.java:144) ~[spring-data-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE] 在 org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration$$EnhancerBySpringCGLIB$$5730cfab.CGLIB$jdbcDialect$1() ~[spring-boot-autoconfigure-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration$$EnhancerBySpringCGLIB$$5730cfab$$FastClassBySpringCGLIB$$5eb1865b.invoke() ~[spring-boot-autoconfigure-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration$$EnhancerBySpringCGLIB$$5730cfab.jdbcDialect() ~[spring-boot-autoconfigure-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) ~[na:1.8.0_241] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_241] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_241] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_241] 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] ... 34个常用框架 省略

如果我使用 spring boot 2.2.7.RELEASE 运行上面的代码,它工作得很好——没有例外!!

2天后,我想到了在localhost上配置一个mysql数据源。相同的程序运行良好(使用 spring boot 2.3.0.RELEASE),但这次它使用了 mysql 数据源。

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

spring boot 2.3.0.RELEASE 中的 oracle jdbc 驱动程序发生了什么?

什么是 mysql jdbc 驱动在 spring boot 2.3.0.RELEASE 中正确执行?

谢谢。

【问题讨论】:

问题在于 Spring Data JDBC 没有为 Oracle 提供开箱即用的方言。有关解决方案,请参阅 Spring Data JDBC Firebird dialect not recognized(尽管您需要对其进行修改以适用于 Oracle)。 嗨@MarkRotteveel:非常感谢。我在那个帖子上联系过你。 spring data jdbc 2.0 如何为 mysql 提供方言但不为 oracle 提供方言——spring 是否突然意识到他们不想支持开箱即用的非常流行的 oracle ?或者这是一个疏忽? 我不知道,你应该向 Spring Data JDBC 的维护人员询问这个问题。 嗨@MarkRotteveel,谢谢。我给他们发了推文。希望假期后能收到他们的来信。 【参考方案1】:

此配置在我的设置中运行良好。

<dependencies>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.3.0.RELEASE</version>

</dependency>

    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>12.2.0.1</version>
    </dependency>
</dependencies>

public class Demo 
    private static String url = "jdbc:oracle:thin:user/pass@localhost:1521/XEPDB1";

    public static void main( String[] args ) 
        System.out.print( "Testing connection to database ..." );

        try 
            Connection conn = DriverManager.getConnection(url);
            System.out.println("OK");
            System.exit(0); // Prevent hang after completion when ran by mvn
         catch (SQLException ignore) 
            System.out.println("ERROR: " + ignore);
            System.exit(1); // Prevent hang after completion when ran by mvn
        
    

【讨论】:

这不使用 Spring Data JDBC。 谢谢,但我需要使用 JdbcTemplate 等 Spring Data jdbc 的东西。不是普通的 jdbc。【参考方案2】:

spring boot 2.3.0.RELEASE 中的 oracle jdbc 驱动程序发生了什么?

JDBC 驱动程序运行良好。

正如您在 cmets 中已经了解到的那样,问题在于

a) Spring Data JDBC 现在要求每个数据库都有一个Dialect

b) Spring Data JDBC 没有为 Oracle 提供 Dialect

修复:

如Spring Data JDBC Firebird dialect not recognized 和https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0 中所述 您现在需要提供自己的 Dialect 实现。

这样的事情应该可以工作:

class MyOracleDialect extends AnsiDialect 

    private static final LimitClause LIMIT_CLAUSE = new LimitClause() 

        @Override
        public String getLimit(long limit) 
            return String.format("FETCH NEXT %d ROWS ONLY", limit);
        

        @Override
        public String getOffset(long offset) 
            return String.format("OFFSET %d ROWS", offset);
        

        @Override
        public String getLimitOffset(long limit, long offset) 
            return String.format("OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", offset, limit);
        

        @Override
        public Position getClausePosition() 
            return Position.AFTER_ORDER_BY;
        
    ;

    @Override
    public LimitClause limit() 
        return LIMIT_CLAUSE;
    


然后,您需要通过 DialectProvider 提供 Dialect,如引用的 *** 问题中所述:

一些背景:

到目前为止,Spring Data 团队没有使用 Oracle 数据库运行他们的集成测试。 这是因为在很长一段时间内,不清楚如何以合法的方式做到这一点,因为包括构建基础设施在内的所有代码都是开源的,而 Oracle 需要接受各种东西才能使用数据库实例或其驱动程序。

现在 Docker 映像可用于测试,并且 JDBC 驱动程序可从 Maven Central 获得。这仍然有点棘手,因为我知道的 docker 图像的当前选项允许您在许多 GB 的图像大小或大约 15 分钟的启动时间之间进行选择。

无论如何,有一个社区成员正在解决这个问题:https://jira.spring.io/browse/DATAJDBC-256

因此,我相信我们将能够在不久的将来全面支持 Oracle。

【讨论】:

据我所知,Oracle 支持 SQL 标准的 OFFSET/FETCH 语法(见this),所以应该可以使用AnsiDialect 而不用替换limit 子句。 @JensSchauder,感谢您的详细解释。但我对春天的期望,尤其是对春天靴子的期望是,对于最常见的东西,一切都是开箱即用的。即使在今天,许多企业应用程序也运行在 Oracle 数据库上。加油,Oracle,请与 spring 合作,让 Oracle DB 和 Java 开发人员的生活更轻松。我们知道您心中有开发者的好意! @JensSchauder :我看到这个问题在 5 月处于 RESOLVED 状态。是什么阻止了 Oracle 在集成测试中使用? @anjanb 该问题已于 7 月解决。答案的“一些背景”部分描述了我们遇到的主要问题。【参考方案3】:

上周我遇到了完全相同的问题。

我在项目中所做的更改更简单:我只是在 pom.xml 中用 tomcat-jdbc 替换了 HikariCP 依赖项:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
    <!-- HikariCP doesn't deals with jdbcDialect properly -->
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
    <!-- Dependency removed -->
    </dependency>
    <!-- Dependency to tomcat-jdbc to deal with jdbcDialect -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jdbc</artifactId>
    </dependency>
    <!--...-->

如果我撤消此操作,您在标题中发布的异常会再次发生。

祝你好运。

【讨论】:

谢谢@user3634250.. 鉴于上面的答案,您的解决方案如何适用于 spring data jdbc 应用程序?【参考方案4】:

这些依赖项对我有用。

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.2.6.RELEASE</version>
</parent>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>

<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc8</artifactId>
  <version>19.6.0.0</version>
</dependency>

【讨论】:

谢谢@Nirmala。但是我们没有使用 Oracle 19.x——我们使用的是 Oracle 12 和 11——不确定是否可以使用更高版本的 ojdbc.jar。 您正在使用 2.2.6.RELEASE 并且该线程与 2.3.x.RELEASE 相关...【参考方案5】:

目前spring data jdbc不支持oracle方言 您需要定义自己的方言解析器 为实现 JdbcDialectProvider 的 Oracle 方言添加以下类。

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Locale;
import java.util.Optional;

import org.springframework.data.jdbc.repository.config.DialectResolver.JdbcDialectProvider;
import org.springframework.data.relational.core.dialect.AnsiDialect;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcOperations;

public class OracleDialectResolver implements JdbcDialectProvider 

    @Override
    public Optional<Dialect> getDialect(JdbcOperations operations) 
        return Optional.ofNullable(operations.execute((ConnectionCallback<Dialect>) OracleDialectResolver::getDialect));
    

    private static Dialect getDialect(Connection connection) throws SQLException 
        DatabaseMetaData metaData = connection.getMetaData();
        String name = metaData.getDatabaseProductName().toLowerCase(Locale.ROOT);
        if (name.contains("oracle")) 
            return AnsiDialect.INSTANCE;
        
        return null;
    


通过将文件 spring.factories 放入类路径的 META-INF 文件夹中注册您的提供程序,并添加以下行。

org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=com.mypackage.jdbctemplate.dialect.OracleDialectResolver //fuly qualified class name of your dialect resolver class

【讨论】:

谢谢。你知道为什么吗?上面的答案提到这是因为 Oracle DB 目前不容易用于单元测试。【参考方案6】:

这个方言解析器解决了我与 Oracle 的问题。

 @Configuration
   public class SpringDataJdbcConfiguration extends AbstractJdbcConfiguration 
    
        @Override
        public Dialect jdbcDialect(NamedParameterJdbcOperations operations) 
            return AnsiDialect.INSTANCE;
        
    

【讨论】:

简单而优雅不知道为什么还没有修复【参考方案7】:

对已发布答案的小更新,适用于 oracle 方言 在 Build.gradle

implementation group: 'org.springframework.data', name: 'spring-data-relational', version: '2.1.1'

然后在下面创建类

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.relational.core.dialect.OracleDialect;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;

@Configuration
public class SpringDataJdbcConfiguration extends AbstractJdbcConfiguration 

  @Override
  public Dialect jdbcDialect(NamedParameterJdbcOperations operations) 
    return OracleDialect.INSTANCE;
  

【讨论】:

以上是关于spring boot 2.3.0.RELEASE 中的新错误:Oracle 12.2.0.1 jdbcdriver 的 UnsatisfiedDependencyException 但与 mysql的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 官方文档链接

spring-boot:build-image 在代理后面

Springboot2.3+Dubbo2.7.3实现灰度跳转

Alibaba Nacos在Spring Cloud中的配置加载顺序超详细分析结果

在外部 iframe 中加载 Spring Webflux 应用程序

Spring Boot 学习例子