如何使用 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无法自动检测JDBCConnectionDataSource的方言,所以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 应用程序停止

如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?

配置审计(Config)变配报警设置

Spring-Boot配置项

如何在 Linux 中分配大的连续内存区域