未从 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 中的 <groupId>
,以便 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