Skip to content

fix(jooq): resolve DSLContext injection ambiguity#1911

Draft
graemerocher wants to merge 4 commits into
7.0.xfrom
fix-issue-1292-jooq-dslcontext
Draft

fix(jooq): resolve DSLContext injection ambiguity#1911
graemerocher wants to merge 4 commits into
7.0.xfrom
fix-issue-1292-jooq-dslcontext

Conversation

@graemerocher

@graemerocher graemerocher commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the internal jOOQ JDBC and R2DBC configuration beans into distinct types
  • create separate DSLContext beans and make the R2DBC-backed DSLContext primary when both are present
  • add a focused regression spec covering default DSLContext injection with JDBC and R2DBC together

Verification

  • ./gradlew :micronaut-jooq:test --tests 'io.micronaut.configuration.jooq.DslContextFactorySpec'\n- ./gradlew :micronaut-jooq:test\n- ./gradlew :micronaut-jooq:txTest\n- ./gradlew :micronaut-jooq:spotlessCheck

Resolves #1292

Co-Authored-By: Codex with GPT-5 <codex@openai.com>
@graemerocher graemerocher added the type: bug Something isn't working label Apr 15, 2026
@graemerocher graemerocher self-assigned this Apr 15, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Resolves Micronaut jOOQ DSLContext injection ambiguity when both JDBC and R2DBC configurations are present by separating configuration bean types and adjusting DSLContext bean creation/selection.

Changes:

  • Introduce distinct internal JdbcConfiguration and R2dbcConfiguration bean types (both extend jOOQ DefaultConfiguration).
  • Update JDBC/R2DBC configuration factories to return those distinct types and refactor shared configuration setup into a generic helper.
  • Create separate DSLContext beans for JDBC vs R2DBC configurations and add a regression spec for the combined setup.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
jooq/src/main/java/io/micronaut/configuration/jooq/AbstractJooqConfigurationFactory.java Refactors shared configuration wiring into configureConfiguration(T) to support distinct config subtypes.
jooq/src/main/java/io/micronaut/configuration/jooq/JooqConfigurationFactory.java Produces JdbcConfiguration instead of generic Configuration.
jooq/src/main/java/io/micronaut/configuration/jooq/R2dbcJooqConfigurationFactory.java Produces R2dbcConfiguration instead of generic Configuration.
jooq/src/main/java/io/micronaut/configuration/jooq/JdbcConfiguration.java New internal JDBC configuration subtype to disambiguate beans.
jooq/src/main/java/io/micronaut/configuration/jooq/R2dbcConfiguration.java New internal R2DBC configuration subtype to disambiguate beans.
jooq/src/main/java/io/micronaut/configuration/jooq/DSLContextFactory.java Splits DSLContext creation per config type and marks the R2DBC one as primary.
jooq/src/test/groovy/io/micronaut/configuration/jooq/DslContextFactorySpec.groovy Adds regression spec validating default DSLContext injection when both JDBC and R2DBC are present.

Comment thread jooq/src/main/java/io/micronaut/configuration/jooq/DSLContextFactory.java Outdated

Copilot AI commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • checkstyle.org
    • Triggering command: /opt/hostedtoolcache/CodeQL/2.25.1/x64/codeql/tools/linux64/java/bin/java /opt/hostedtoolcache/CodeQL/2.25.1/x64/codeql/tools/linux64/java/bin/java -jar /opt/hostedtoolcache/CodeQL/2.25.1/x64/codeql/xml/tools/xml-extractor.jar --fileList=/tmp/codeql-scratch-3333d316ef795607/dbs/java/working/files-to-index6523434060097005990.list --sourceArchiveDir=/tmp/codeql-scratch-3333d316ef795607/dbs/java/src --outputDir=/tmp/codeql-scratch-3333d316ef795607/dbs/java/trap/java .resources.server.access.token=73ec0d84-f82e-462-p .resources.server.client.read.timeout=180 .resources.servegit ernal.worker.tmpcheckout /REDACTED/work/micfix-issue-1292-jooq-dslcontext touch /opt�� ash y by/a463ddb13c076a239034007fc79a2tcp ntime.v2.task/mogit /tmp/tmp.1v2ksANshow /usr/bin/chmod es (dns block)
    • Triggering command: /opt/hostedtoolcache/CodeQL/2.25.1/x64/codeql/tools/linux64/java/bin/java /opt/hostedtoolcache/CodeQL/2.25.1/x64/codeql/tools/linux64/java/bin/java -jar /opt/hostedtoolcache/CodeQL/2.25.1/x64/codeql/xml/tools/xml-extractor.jar --fileList=/tmp/codeql-scratch-3333d316ef795607/dbs/java/working/files-to-index17438996435036073364.list --sourceArchiveDir=/tmp/codeql-scratch-3333d316ef795607/dbs/java/src --outputDir=/tmp/codeql-scratch-3333d316ef795607/dbs/java/trap/java --log urin-21-jdk-amd64/lib/jspawnhelper --log-format json delete urin-21-jdk-amd64/lib/jspawnhelper list�� --no-pager --no-legend de/node/bin/git tcp -host-ip ree/bin/oracle e/git (dns block)
  • docs.hibernate.org
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc @/home/REDACTED/work/micronaut-sql/micronaut-sql/build/tmp/javadoc/javadoc.options json awk -v conf=general-logPREROUTING runtime-runc/mob-p e-handler 36a375978afb2e7f/usr/lib/open-iscsi/net-interface-handler 90d416775e8f9ee3stop 3c48bb4d831a0a25--dport e-handler 21.0�� (dns block)
  • docs.oracle.com
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc @/home/REDACTED/work/micronaut-sql/micronaut-sql/build/tmp/javadoc/javadoc.options json awk -v conf=general-logPREROUTING runtime-runc/mob-p e-handler 36a375978afb2e7f/usr/lib/open-iscsi/net-interface-handler 90d416775e8f9ee3stop 3c48bb4d831a0a25--dport e-handler 21.0�� (dns block)
  • ge.micronaut.io
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED -Xmx2048M -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant (dns block)
  • jdbi.org
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc @/home/REDACTED/work/micronaut-sql/micronaut-sql/build/tmp/javadoc/javadoc.options json awk -v conf=general-logPREROUTING runtime-runc/mob-p e-handler 36a375978afb2e7f/usr/lib/open-iscsi/net-interface-handler 90d416775e8f9ee3stop 3c48bb4d831a0a25--dport e-handler 21.0�� (dns block)
  • www.example.com
    • Triggering command: /opt/oracle/product/26ai/dbhomeFree/bin/oracle oracleFREE (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) k/_temp/ghcca-node/node/bin/bash--bootstrap e7718b96b4a792cca57/log.json --ro�� /var/run/docker/runtime-runc/mob--datadir=/var/lib/mysql/ 74e9a57c6c0b47d57449cbf6d370a1301a3 e-handler 74e9a57c6c0b47d57449cbf6d370a1301a3/init.pid json --systemd-cgroup-t e-handler -d -c } table.d/chrony-otcp by/7c88eb0534fc7mv (dns block)
    • Triggering command: /opt/oracle/product/26ai/dbhomeFree/bin/oracle oracleFREE (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) --bundle /run/containerd/io.containerd.runtime.v2.task/moby/3c6241c7bb2c2ced52ae43373a2329392cb260b19c685a0fa624bf299ff6c0d5 --pid-file /run/containerd/io.containerd.runtime.v2.task/moby/3c6241c7bb2c2ced52ae43373a2329392cb260b19c685a0fa624bf299ff6c0d5/init.pid 3c6241c7bb2c2ced52ae43373a2329392cb260b19c685a0fa624bf299ff6c0d5 /usr/bin/date io.containerd.rubash e00 aeee3d4fb913c629mysqld (dns block)
    • Triggering command: /opt/oracle/product/26ai/dbhomeFree/bin/oracle oracleFREE (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) --bundle /run/containerd/io.containerd.runtime.v2.task/moby/b99c0a58edd864d0a7a7663cd08b121ded6f682831e6d574b9f7167a1fa573ba --pid-file /run/containerd/io.containerd.runtime.v2.task/moby/b99c0a58edd864d0a7a7663cd08b121ded6f682831e6d574b9f7167a1fa573ba/init.pid b99c0a58edd864d0a7a7663cd08b121ded6f682831e6d574b9f7167a1fa573ba ree/bin/oracle by/04ef2ca750e85awk 32792 &#34;REQUESTS_CA_Bconf=datadir bash /usr�� e41c17738537d037-d /tmp/tmp.zjvNzDb172.17.0.17 urin-21-jdk-amd6--dport 0ddff195a0830d70grep 2d881689ce8f5d2d-qE by/75bef0b12dde8(create|run) urin-21-jdk-amd64/bin/java (dns block)
  • www.jooq.org
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc /usr/lib/jvm/temurin-21-jdk-amd64/bin/javadoc @/home/REDACTED/work/micronaut-sql/micronaut-sql/build/tmp/javadoc/javadoc.options json awk -v conf=general-logPREROUTING runtime-runc/mob-p e-handler 36a375978afb2e7f/usr/lib/open-iscsi/net-interface-handler 90d416775e8f9ee3stop 3c48bb4d831a0a25--dport e-handler 21.0�� (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

* @param configuration The {@link Configuration}
* @return A {@link DSLContext}
*/
@EachBean(Configuration.class)

@radovanradic radovanradic Apr 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this cause regression for existing apps where users provide Configuration bean, this might not work then since it will expect Jdbc/R2dbc/Configuration?
This test would fail (passing in 7.0.x)

void "test dsl context is created for custom jooq configuration bean"() {
        given:
        ApplicationContext applicationContext = ApplicationContext.run("custom-configuration")

        expect:
        applicationContext.containsBean(Configuration)
        applicationContext.containsBean(DSLContext)
        applicationContext.getBean(DSLContext).configuration().dialect() == SQLDialect.POSTGRES

        cleanup:
        applicationContext.close()
    }

    @Factory
    @Requires(env = "custom-configuration")
    static class TestFactory {

        @Singleton
        @Named("default")
        Configuration configuration() {
            DefaultConfiguration configuration = new DefaultConfiguration()
            configuration.setSQLDialect(SQLDialect.POSTGRES)
            return configuration
        }
    }

@Primary
@Singleton
@Requires(beans = R2dbcConfiguration.class)
DSLContext primaryR2dbcDslContext(@Any BeanProvider<R2dbcConfiguration> configurations) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could the new primary alias duplicate one DSLContext?

@graemerocher graemerocher marked this pull request as draft April 24, 2026 09:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Micronaut jOOQ tries to inject mulitple possible bean(Configuration) candidates

4 participants