当前位置: 首页 > 知识库问答 >
问题:

Spring引导2.3.0中的新错误。发布:不满意依赖异常为Oracle12.2.0.1jdbc驱动程序,但不与mysql jdbc驱动程序

养焱
2023-03-14

创建了一个新的启动项目,其中仅使用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>

我在应用程序中配置数据源。属性文件并运行这个简单的应用程序,它将使用下面的stacktrace进行轰炸。

2020-05-25 15:07:16.769警告11840---[main]s.c.a.AnnotationConfigApplicationContext:上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂未满足的DependencyException:创建名为“jdbcConverter”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/data/jdbc/jdbrepositoriesautoconfiguration$SpringBootJdbcConfiguration.class]:通过方法“jdbconverter”参数4表示的未满足的依赖关系;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建在类路径资源[org/springframework/boot/autoconfigure/data/jdbc/jdbrepositoriesautoconfiguration$SpringBootJdbcConfiguration.class]中定义的名为“jdbclatel”的bean时出错:通过工厂方法实例化bean失败;嵌套的异常是org。springframework。豆。BeanInstationException:未能实例化[org.springframework.data.relational.core.dialogue.dialogue]:工厂方法“jdbcDialogue”引发异常;嵌套的异常是org。springframework。数据jdbc。存储库。配置。方言解析程序$NoDialectException:无法确定组织的方言。springframework。jdbc。果心JdbcTemplate@7fe083b1.请提供一种方言。2020-05-25 15:07:16.769信息11840---[main]com。扎克塞尔。希卡里。HikariDataSource:HikariPool-1-已启动关机。。。2020-05-25 15:07:17.023信息11840---[main]com。扎克塞尔。希卡里。HikariDataSource:HikariPool-1-关闭完成。2020-05-25 15:07:17.028信息11840---[main]条件评估报告日志监听器:

启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2020-05-25 15:07:17.035错误11840---[main]o.s.引导。SpringApplication
:应用程序运行失败

如果我使用SpringBoot2.2运行上述代码。7.发布后,它工作正常——没有例外!!

两天后,我想到在localhost上配置一个mysql数据源。同样的程序运行得很好(使用SpringBoot2.3.0.RELEASE),但这次它使用了mysql数据源。

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

SpringBoot2.3中的OracleJDBC驱动程序发生了什么。0.0版本?

在SpringBoot2.3中,MySQLJDBC驱动程序正确地执行了什么操作。0.0版本?

谢谢你。

共有3个答案

周麒
2023-03-14

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

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来注册您的提供者。在类路径的META-INF文件夹中创建工厂,并添加以下行。

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

毋胜涝
2023-03-14

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

 @Configuration
   public class SpringDataJdbcConfiguration extends AbstractJdbcConfiguration {
    
        @Override
        public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
            return AnsiDialect.INSTANCE;
        }
    }
龚鸿羽
2023-03-14

SpringBoot2.3中的OracleJDBC驱动程序发生了什么。0.0版本?

JDBC驱动程序运行良好。

正如你在评论中已经了解到的,问题是

a)Spring Data JDBC现在需要每个数据库的Dialect

b)Spring Data JDBC不附带Oracle的Dialect

如Spring数据中所述,未识别JDBC Firebird方言,并且https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0 您需要立即提供自己的方言实现。

这样的东西应该工作:

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;
    }

}

然后,您需要通过方言提供者提供方言,如参考问题中所述:

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

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

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

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

 类似资料:
  • 问题内容: 在硒测试中出现以下错误 我所做的是 环境: Firefox v47.0 Webdriver 3.0.0-beta2 问题答案: 这是完全可以预期的。没有GeckoDriver(木偶)的发行版支持该类。这是Mozilla团队开发Marionette的首要任务之一。

  • 我正在尝试开发spring boot应用程序,它将在后端连接到oracle DB。对于oracle db连接,我添加了ojdbc6驱动程序依赖项。我在.m2文件夹中已经有了ojdbc6 jar。但我仍然在POM.xml中发现ojdbc6依赖项“缺少工件com.oracle:ojdbc6:jar:11.2.0.3”的编译错误 pom.xml中出错:

  • 我正试图在eclipse中运行我的第一个webdriver脚本。使用jre1。8.0_1111. 我使用了下面的代码,但它显示了错误。请帮我查一下密码。 错误堆栈 线程“main”java中出现异常。lang.IllegalStateException:驱动程序可执行文件的路径必须由webdriver设置。壁虎。驱动系统属性;有关更多信息,请参阅github。com/mozilla/geckodr

  • 我使用Firefox驱动程序编写了许多Selenium测试,效果很好。但由于某些原因,我现在在尝试实例化Firefox驱动程序时遇到了一个异常。有人知道Firefox的任何更新可能会影响这一点吗? 下面是两行代码。异常发生在第2行:- 以下是我得到的例外情况:- “WebDriver.dll中出现“OpenQA.Selenium.WebDriverException”类型的异常,但未在用户代码中处

  • 如果我使用的是maven插件,并且通过它一切都很好,但是我怎么能在没有Maven插件的情况下运行它,使用运行配置并从那里设置Tomcat。如果我做一些,出现以下错误: 使用插件一切工作:Maven项目 - 但是,当我尝试通过不同的运行配置运行同一个项目时,问题出现了,如下所示: 错误来自标记行: 问题可能与运行配置有关。

  • 我正在使用Selenium Grid。我最近将VM(node)更新到Windows 10,它不再工作了。以下是详细信息 我通过以下方式将此VM Win10注册为网格节点: (这之前与VM Win8一起工作得很好)我可以在网格上看到这个VM Win10注册了3个浏览器IE11、FF和Chrome 在我的代码中,我通过以下方式创建web驱动程序: 我总是得到这个错误当我执行测试 转发新会话时出错,无法