我想告诉 JOOQ 不要在它根据此处的答案生成的 SQL 中引用标识符:https://stackoverflow.com/a/28146263/924597
但是考虑到我让 Spring Boot 自动配置 JOOQ - 我应该把这个设置放在哪里?
基本的spring boot配置好像只支持在
spring.jooq.sql-dialect
中设置application.properties
,如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。
请注意,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://stackoverflow.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
})
您还可以提供一个设置 bean(返回一个
org.jooq.conf.Settings
对象)。
解决原问题的示例:
@Configuration
public class JooqConfig {
@Bean
Settings jooqSettings() {
return new Settings().withRenderNameStyle(RenderNameStyle.AS_IS);
}
}
Spring Boot 文档目前缺少该,但我检查了源并在本地进行了测试,我创建了一个PR来修复它。
从 Spring Boot 3.0 开始,您需要使用
DefaultConfigurationCustomizer
,例如:
@Configuration
public class JooqConfig {
@Bean
public DefaultConfigurationCustomizer jooqDefaultConfigurationCustomizer() {
return c -> c.settings().withRenderNameStyle(RenderNameStyle.AS_IS);
}
}
更多信息请访问jooq博客。
Spring Boot 是一个工具包,可以让您尽快开始一些依赖项。这并不意味着您应该通过 Spring Boot 完成“所有事情”。 Spring Boot 不可能维护与每个第三方库的标志相对应的标志。 Spring Boot之所以支持
spring.jooq.sql-dialect
,是因为在某些情况下,jOOQ无法自动检测来自JDBC
Connection
或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
注入各处。
org.springframework.boot.autoconfigure.jooq.DefaultConfigurationCustomizer
,如下所示(Kotlin 中的示例):
@Bean
fun jooqConfigurationCustomizer(): DefaultConfigurationCustomizer =
DefaultConfigurationCustomizer { config ->
config.setSettings(
Settings()
.withBindOffsetDateTimeType(true)
.withRenderQuotedNames(RenderQuotedNames.EXPLICIT_DEFAULT_UNQUOTED)
)
}