【问题标题】:How to configure JOOQ settings using Spring-Boot config?如何使用 Spring-Boot config 配置 JOOQ 设置?
【发布时间】:2019-12-23 20:05:30
【问题描述】:

我想告诉 JOOQ 不要引用它根据此处的答案生成的 SQL 中的标识符:https://stackoverflow.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。

【问题讨论】:

    标签: spring-boot jooq


    【解决方案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://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
    })
    

    【讨论】:

      【解决方案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 处理,这对我不起作用。如果其他答案有任何明显的问题,您能否发表评论?
      猜你喜欢
      • 2020-09-23
      • 2017-01-08
      • 1970-01-01
      • 2017-08-23
      • 2012-07-01
      • 2015-09-17
      • 2017-04-19
      • 2016-07-29
      • 2017-01-06
      相关资源
      最近更新 更多