如何使用 Spring-Boot 配置来配置 JOOQ 设置?

问题描述 投票:0回答:4

我想告诉 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。

spring-boot jooq
4个回答
6
投票

请注意,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
})

6
投票

您还可以提供一个设置 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博客


1
投票

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

注入各处。

    


0
投票
org.springframework.boot.autoconfigure.jooq.DefaultConfigurationCustomizer

,如下所示(Kotlin 中的示例):

    @Bean
    fun jooqConfigurationCustomizer(): DefaultConfigurationCustomizer =
        DefaultConfigurationCustomizer { config ->
            config.setSettings(
                Settings()
                    .withBindOffsetDateTimeType(true)
                    .withRenderQuotedNames(RenderQuotedNames.EXPLICIT_DEFAULT_UNQUOTED)
            )
        }

© www.soinside.com 2019 - 2024. All rights reserved.