如何使用 Spring-Boot config 配置 JOOQ 设置?
Posted
技术标签:
【中文标题】如何使用 Spring-Boot config 配置 JOOQ 设置?【英文标题】:How to configure JOOQ settings using Spring-Boot config? 【发布时间】:2019-12-23 20:05:30 【问题描述】:我想告诉 JOOQ 不要引用它根据此处的答案生成的 SQL 中的标识符:https://***.com/a/28146263/924597
但是考虑到我让 Spring Boot 自动配置 JOOQ - 我应该把这个设置放在哪里?
似乎基本的spring boot config只支持在application.properties
中设置spring.jooq.sql-dialect
,如JOOQ-spring-boot-example所示。
我尝试将spring.jooq.renderNameStyle=AS_IS
放入application.properties
,但对SQL 没有任何影响。
有没有办法自定义 Spring boot JOOQ 配置而无需自己配置 JOOQ?
我正在使用 SpringBoot 2.1.7.RELEASE 和 JOOQ 3.11.12。
【问题讨论】:
【参考方案1】:请注意,Lukas 的回答对配置渲染样式有效,但导致 JOOQ
不再参与 Spring
事务处理。
以下是我添加到项目中以自定义标识符呈现的代码。
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.conf.RenderNameStyle;
import org.jooq.conf.Settings;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.jooq.impl.DefaultExecuteListenerProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
/**
Override spring-boot config so JOOQ settings can be customised.
See: https://***.com/q/57542573/924597
Spring-boot config taken from:
https://github.com/eugenp/tutorials/blob/master/spring-jooq/src/test/java/com/baeldung/jooq/springboot/InitialConfiguration.java
*/
@Component
@Configuration
public class JooqConfig
@Autowired DataSource dataSource;
@Bean
public DataSourceConnectionProvider connectionProvider()
return new DataSourceConnectionProvider(
new TransactionAwareDataSourceProxy(dataSource));
@Bean
public DSLContext dsl()
return new DefaultDSLContext(configuration());
public DefaultConfiguration configuration()
DefaultConfiguration config = new DefaultConfiguration();
config.set(connectionProvider());
config.set(SQLDialect.POSTGRES);
config.set(new Settings().
withRenderNameStyle(RenderNameStyle.AS_IS ));
config.set(new DefaultExecuteListenerProvider(
new JooqExceptionTranslator() ));
return config;
注意:上面的代码似乎可以工作,但导致我的 IDE 告诉我我有多个为 DSLContext
类型注册的 bean。我还将JooqAutoConfigration
添加到我的排除spring-boot
自动配置列表中。
@EnableAutoConfiguration(exclude =
SecurityAutoConfiguration.class,
DataSourceAutoConfiguration.class,
JooqAutoConfiguration.class
)
【讨论】:
【参考方案2】:您还可以提供一个 Settings bean(返回一个 org.jooq.conf.Settings
对象)。
解决原始问题的示例:
@Component
public class JooqConfig
@Bean
Settings jooqSettings()
return new Settings().withRenderNameStyle(RenderNameStyle.AS_IS);
Spring Boot 文档目前是missing that,但我检查了source 并在本地进行了测试,我创建了一个PR 来修复它。
【讨论】:
感谢您的 PR,这将从 Spring Boot 2.1.10 和 2.2.1 开始记录【参考方案3】:Spring Boot 是一个工具包,可让您开始尽快使用一些依赖项。这并不意味着您应该通过 Spring Boot 做一切。 Spring Boot 不可能维护一个与每个第三方库的标志相对应的标志。
spring boot之所以支持spring.jooq.sql-dialect
是因为在某些情况下jOOQ无法自动检测JDBCConnection
或DataSource
的方言,所以Spring Boot有必要将这些信息提供给jOOQ .另一方面,Settings.renderNameStyle
是一个更高级的设置,Spring Boot 不需要知道它就可以启动最小配置。
因此,一旦您开始使用更复杂的库设置/标志,您就需要自己配置库。在这种情况下,您可以通过编程方式或通过各种其他 Spring 惯用方式提供 DSLContext
bean,例如
@Autowired DataSource ds;
@Bean
public DSLContext ctx()
DSL.using(ds, SQLDialect.ORACLE, new Settings().withRenderNameStyle(AS_IS));
然后在各处注入 DSLContext
。
【讨论】:
如我的回答中所述,由于 TX 处理,这对我不起作用。如果其他答案有任何明显的问题,您能否发表评论?以上是关于如何使用 Spring-Boot config 配置 JOOQ 设置?的主要内容,如果未能解决你的问题,请参考以下文章
Spring-Boot Config:如何在用于填充 Map<String, String> 的 yaml 键中保留空格
当 logging.config 指向 logfj2 外部配置文件的错误文件位置时,spring-boot 应用程序停止