未从 application.properties 中提取 Spring Boot JOOQ sql 方言

Posted

技术标签:

【中文标题】未从 application.properties 中提取 Spring Boot JOOQ sql 方言【英文标题】:Spring Boot JOOQ sql dialect not picked up from application.properties 【发布时间】:2017-08-23 11:03:39 【问题描述】:

背景:我在我的 nexus 存储库中托管 jooq 3.9.1 的试用版(专有的例如 oracle db 兼容) - 我的 pom 中与 jooq 相关的所有依赖项都指向这一点。

我的 application.properties 中有这一行

jooq.sql-dialect=ORACLE

但是当我检查注入的 dslContext 时,方言设置为“DEFAULT”,而不是预期/期望的 ORACLE。

我目前正在通过自动装配数据源而不是 dslcontext 然后设置 sql 方言来绕过它(如下所示) - 但想知道为什么直接自动装配 dslcontext 不能按预期工作

@Autowired
private DataSourceConnectionProvider dataSource;



public static final SQLDialect sqlDialect = SQLDialect.ORACLE;

public DSLContext getDSL()
    return DSL.using(dataSource, sqlDialect);

【问题讨论】:

你确定配置应该是jooq.sql-dialect吗?该手册引用了一个配置spring.jooq.sql-dialect:docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/html/… 作为记录,Spring Boot 本身可能还有一些改进的空间。以防万一,I've registered an issue here 【参考方案1】:

卢卡斯的评论Spring Boot JOOQ sql dialect not picked up from application.properties是正确的。

这是一个如何做和测试的例子:

在 application.properties 中

spring.jooq.sql-dialect = Postgres

并通过集成测试进行了测试ConfigIT

@RunWith(SpringRunner.class)
@JdbcTest
@ImportAutoConfiguration(JooqAutoConfiguration.class)
public class ConfigIT 

    @Autowired
    private DSLContext dSLContext;

    @Test
    public void dialectShouldBePickedUp() 
        assertThat(dSLContext.configuration().dialect(), is(SQLDialect.POSTGRES));
    

您可以在http://springbootbuch.de 的存储库中找到工作和测试的示例:https://github.com/springbootbuch/database_examples

重要的是选择正确的、区分大小写的名称。在我的示例中,它是Postgres,在您的示例中它应该是Oracle,并且您必须使用正确的属性。可悲的是,这些名称因不同的工具集而异。对于 jOOQ,您可以在 org.jooq.SQLDialect 中找到常量

【讨论】:

【参考方案2】:

Spring Boot by default uses the org.jooq dependency,即 jOOQ 开源版的 Maven groupId

<dependency>
    <groupId>org.jooq</groupId>
    <artifactId>jooq</artifactId>
</dependency>

但是,Oracle SQLDialect 仅包含在 jOOQ 的商业发行版中,它们在不同的 groupId 下可用(不是来自 Maven Central,而是来自 here (trial) 和 here (express, professional, enterprise edition)):

<groupId>org.jooq.pro</groupId>        <!-- for commercial editions -->
<groupId>org.jooq.pro-java-6</groupId> <!-- for commercial editions with Java 6 support -->
<groupId>org.jooq.trial</groupId>      <!-- for the free trial edition -->

这些发行版几乎完全兼容二进制,因此您应该能够简单地替换您自己的 pom.xml 中的 &lt;groupId&gt;,以便 Spring Boot 与 jOOQ 和 Oracle 一起使用。

【讨论】:

感谢您的超级快速响应。我正在使用我的 nexus 存储库中托管的试用版 (3.9.1)。我目前正在通过自动装配数据源而不是 dslContext 并设置 sqldialect 为我提供正确的方言 dslContext 来解决这个问题 @JohnWilson:哦,当然,这很有道理。 有什么作用?原来的问题仍然存在? 您的解决方法非常合理。你试过我的回答吗?有用吗? 如果我没有使用 jooq 的商业版本,那么我将无法在我的解决方法中设置 oracle 方言,因为你说它在操作系统添加中不可用,所以回答你的问题- 不,你的答案不起作用,即使使用商业(试用)版的 jooq,spring boot 也不会在 application.properties 中选择 jooq.sql-dialect=ORACLE

以上是关于未从 application.properties 中提取 Spring Boot JOOQ sql 方言的主要内容,如果未能解决你的问题,请参考以下文章

springboot配置文件application-dev.properties,application-prod.properties,application-test.properties(代码片

为啥 Testcontainers 不使用 application.properties / application.yaml?

Spring Boot系统配置文件application.properties和application.yml

Spring Boot系统配置文件application.properties和application.yml

Spring Boot系统配置文件application.properties和application.yml

Spring Boot 配置文件: application.properties和application.yaml