Upgrade to jOOQ 3.20 and require Java 21 to use it

Closes gh-48619
This commit is contained in:
Andy Wilkinson
2026-01-06 13:03:11 +00:00
parent a749b2fd58
commit 56928bbe38
8 changed files with 123 additions and 52 deletions
@@ -4,6 +4,9 @@
Spring Boot {version-spring-boot} requires at least https://www.java.com[Java 17] and is compatible with versions up to and including Java 25.
{url-spring-framework-docs}/[Spring Framework {version-spring-framework}] or above is also required.
Support for third-party projects may have additional or higher requirements.
Refer to the documentation for that support for further details.
Explicit build support is provided for the following build tools:
|===
-1
View File
@@ -49,7 +49,6 @@ dependencies {
dockerTestRuntimeOnly("org.postgresql:postgresql")
testImplementation(project(":core:spring-boot-test"))
testImplementation(project(":module:spring-boot-jooq"))
testImplementation(project(":test-support:spring-boot-test-support"))
testImplementation(testFixtures(project(":core:spring-boot-autoconfigure")))
testImplementation("jakarta.persistence:jakarta.persistence-api")
@@ -49,9 +49,6 @@ import org.flywaydb.database.oracle.OracleConfigurationExtension;
import org.flywaydb.database.postgresql.PostgreSQLConfigurationExtension;
import org.flywaydb.database.sqlserver.SQLServerConfigurationExtension;
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DefaultDSLContext;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InOrder;
@@ -60,7 +57,6 @@ import org.postgresql.Driver;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.flyway.autoconfigure.FlywayAutoConfiguration.FlywayAutoConfigurationRuntimeHints;
@@ -822,37 +818,6 @@ class FlywayAutoConfigurationTests {
});
}
@Test
void whenFlywayIsAutoConfiguredThenJooqDslContextDependsOnFlywayBeans() {
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class)
.run((context) -> {
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayInitializer", "flyway");
});
}
@Test
void whenCustomMigrationInitializerIsDefinedThenJooqDslContextDependsOnIt() {
this.contextRunner
.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class,
CustomFlywayMigrationInitializer.class)
.run((context) -> {
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayMigrationInitializer",
"flyway");
});
}
@Test
void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() {
this.contextRunner
.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class, CustomFlyway.class)
.run((context) -> {
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("customFlyway");
});
}
@Test
void scriptPlaceholderPrefixIsCorrectlyMapped() {
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
@@ -1186,16 +1151,6 @@ class FlywayAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
static class JooqConfiguration {
@Bean
DSLContext dslContext() {
return new DefaultDSLContext(SQLDialect.H2);
}
}
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(DataSourceProperties.class)
abstract static class AbstractUserH2DataSourceConfiguration {
@@ -23,6 +23,12 @@ plugins {
description = "Spring Boot jOOQ Test"
systemRequirements {
java {
version = JavaLanguageVersion.of(21)
}
}
dependencies {
api(project(":core:spring-boot-test-autoconfigure"))
api(project(":module:spring-boot-jdbc-test"))
+7
View File
@@ -24,6 +24,12 @@ plugins {
description = "Spring Boot jOOQ"
systemRequirements {
java {
version = JavaLanguageVersion.of(21)
}
}
dependencies {
api(project(":module:spring-boot-jdbc"))
api(project(":module:spring-boot-transaction"))
@@ -34,6 +40,7 @@ dependencies {
optional("jakarta.xml.bind:jakarta.xml.bind-api")
testImplementation(project(":core:spring-boot-test"))
testImplementation(project(":module:spring-boot-flyway"))
testImplementation(project(":test-support:spring-boot-test-support"))
testRuntimeOnly("ch.qos.logback:logback-classic")
@@ -0,0 +1,105 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.jooq.autoconfigure;
import org.flywaydb.core.Flyway;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DefaultDSLContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.flyway.autoconfigure.FlywayAutoConfiguration;
import org.springframework.boot.flyway.autoconfigure.FlywayMigrationInitializer;
import org.springframework.boot.jdbc.autoconfigure.EmbeddedDataSourceConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for jOQQ when Flyway is being used for DB initialization.
*
* @author Andy Wilkinson
*/
class JooqFlywayDatabaseInitializationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(FlywayAutoConfiguration.class))
.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class)
.withPropertyValues("spring.datasource.generate-unique-name=true");
@Test
void whenFlywayIsAutoConfiguredThenJooqDslContextDependsOnFlywayBeans() {
this.contextRunner.run((context) -> {
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayInitializer", "flyway");
});
}
@Test
void whenCustomMigrationInitializerIsDefinedThenJooqDslContextDependsOnIt() {
this.contextRunner.withUserConfiguration(CustomFlywayMigrationInitializer.class).run((context) -> {
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("flywayMigrationInitializer", "flyway");
});
}
@Test
void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() {
this.contextRunner.withUserConfiguration(CustomFlyway.class).run((context) -> {
BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext");
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("customFlyway");
});
}
@Configuration(proxyBeanMethods = false)
static class JooqConfiguration {
@Bean
DSLContext dslContext() {
return new DefaultDSLContext(SQLDialect.H2);
}
}
@Configuration(proxyBeanMethods = false)
static class CustomFlywayMigrationInitializer {
@Bean
FlywayMigrationInitializer flywayMigrationInitializer(Flyway flyway) {
FlywayMigrationInitializer initializer = new FlywayMigrationInitializer(flyway);
initializer.setOrder(Ordered.HIGHEST_PRECEDENCE);
return initializer;
}
}
@Configuration(proxyBeanMethods = false)
static class CustomFlyway {
@Bean
Flyway customFlyway() {
return Flyway.configure().load();
}
}
}
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-3.19.29.xsd">
<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-3.20.10.xsd">
<batchSize>100</batchSize>
</settings>
@@ -1058,11 +1058,7 @@ bom {
]
}
}
library("jOOQ", "3.19.29") {
prohibit {
versionRange "[3.20.0,)"
because "it requires Java 21"
}
library("jOOQ", "3.20.10") {
group("org.jooq") {
bom("jooq-bom")
plugins = [