尝试编写一个小型演示应用程序来检查 jOOQ 的审核列是否按照我们的预期进行。
只需一个
last_modified
时间戳和last_modifier
整数ID
根据上面链接页面上的信息,我希望它看起来像这样:
build.gradle.kts (
jooq-codegen
)
import org.jooq.meta.jaxb.ForcedType
import org.jooq.meta.jaxb.Logging
plugins {
id("nu.studer.jooq") version "7.1.1"
}
val jooqGroup by extra{"org.jooq.trial-java-8"}
val jooqVersion by extra{"3.17.3"}
dependencies {
api("$jooqGroup:jooq:$jooqVersion")
implementation("$jooqGroup:jooq-codegen:$jooqVersion")
implementation("$jooqGroup:jooq-meta:$jooqVersion")
jooqGenerator("org.postgresql:postgresql:42.4.2")
runtimeOnly("org.postgresql:postgresql:42.4.2")
}
jooq {
version.set(jooqVersion)
edition.set(nu.studer.gradle.jooq.JooqEdition.TRIAL_JAVA_8)
configurations {
create("poc") {
generateSchemaSourceOnCompilation.set(false)
jooqConfiguration.apply {
logging = Logging.WARN
jdbc.apply {
driver = "org.postgresql.Driver"
url = "jdbc:postgresql://localhost:5432/mydemo"
user = "foo"
password = "bar"
}
generator.apply {
name = "org.jooq.codegen.DefaultGenerator"
database.apply {
name = "org.jooq.meta.postgres.PostgresDatabase"
inputSchema = "public"
forcedTypes.addAll(listOf(
ForcedType().apply {
name = "varchar"
includeExpression = ".*"
includeTypes = "JSONB?"
},
ForcedType().apply {
name = "varchar"
includeExpression = ".*"
includeTypes = "INET"
},
ForcedType().apply {
auditUpdateUser = true
name = "int"
includeExpression = "last_modifier"
},
ForcedType().apply {
auditUpdateTimestamp = true
name = "timestamptz"
includeExpression = "last_modified"
}
))
}
generate.apply {
isPojos = false
isDaos = false
isRecords = true
isDeprecated = false
}
target.apply {
packageName = "my.app.jooq"
directory = "src/main/java"
}
strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy"
}
}
}
}
}
除了
auditUpdateUser
和 auditUpdateTimestamp
都是
未解决的参考
我怀疑原因是审计列似乎只能从 jOOQ
3.17
开始使用,并且 studer 的最新插件版本 落后于仅支持 3.16.4
。
鉴于此 - 并假设这确实是正确的 - 我如何最好地启用审核列?
我当然可以尝试子类化
ForcedType
,看看是否可以在那里添加对它的支持,直到插件正式支持它。
但是有没有一种更简单的方法来设置审计列而无需这样做?
更新
所以问题是顶部导入的
org.jooq.meta.jaxb.ForcedType
是版本3.16.4
而不是3.17.3
。
我们可以通过添加
来强制执行正确的版本,正如卢卡斯在下面的回答中提到的那样buildscript {
configurations["classpath"].resolutionStrategy.eachDependency {
if (requested.group == "org.jooq") {
useVersion("3.17.3")
}
}
}
到脚本的开头。
但是,这似乎引入了 jOOQ 的开源版本,它需要 java 17(并且目标项目仍在 java 11 上)。
java.lang.UnsupportedClassVersionError:org/jooq/meta/jaxb/Configuration 已由更新版本的 Java 运行时(类文件版本 61.0)编译,此版本的 Java 运行时仅识别最高版本 55.0 的类文件
我认为我们不需要更新到 java 17 来使用与 java-8 兼容的依赖项。
https://github.com/etiennestuder/gradle-jooq-plugin/issues/183建议类似
dependencies {
api("$jooqGroup:jooq:$jooqVersion")
implementation("$jooqGroup:jooq-codegen:$jooqVersion")
implementation("$jooqGroup:jooq-meta:$jooqVersion")
jooqGenerator("org.postgresql:postgresql:42.4.2")
runtimeOnly("org.postgresql:postgresql:42.4.2")
modules {
module("org.jooq:jooq") {
replacedBy("$jooqGroup:jooq", "nu.studer.jooq bugfix #183") // https://github.com/etiennestuder/gradle-jooq-plugin/issues/183
}
}
}
可能有帮助,但到目前为止还没有任何明显的效果。
更新
为了可重现性,
build.gradle.kts (jooq-codegen)
项目是一个小型 Spring 应用程序的一部分,该应用程序有两个模块:jooq-codegen
和server
。这是另外两个 gradle 文件:
build.gradle.kts(
app
)
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.7.3"
id("io.spring.dependency-management") version "1.0.13.RELEASE"
kotlin("jvm") version "1.6.21"
kotlin("plugin.spring") version "1.6.21"
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
}
springBoot {
mainClass.value("my.app.server.JooqAuditLoggingApplication")
}
allprojects {
repositories {
mavenCentral()
mavenLocal{
content{
includeGroup("org.jooq.trial-java-8")
}
}
}
group = "my.app"
version = "0.0.1-SNAPSHOT"
tasks.withType<JavaCompile>{
options.encoding = "UTF-8"
}
}
subprojects {
apply(plugin ="io.spring.dependency-management")
apply(plugin ="java-library")
java.sourceCompatibility = JavaVersion.VERSION_11
java.targetCompatibility = JavaVersion.VERSION_11
}
project("jooq-codegen"){
}
project("server"){
apply(plugin = "org.jetbrains.kotlin.jvm")
apply(plugin ="org.jetbrains.kotlin.plugin.spring")
dependencies {
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
}
build.gradle.kts(
server
)
import org.flywaydb.gradle.task.FlywayMigrateTask
plugins {
id("org.springframework.boot") version "2.7.3"
id("org.flywaydb.flyway") version "9.0.1"
}
dependencies {
implementation(project(":jooq-codegen"))
implementation("org.springframework.boot:spring-boot-starter-jooq"){
exclude("org.jooq","jooq")
}
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
implementation("org.flywaydb:flyway-core")
}
flyway {*emphasized text*
url = "jdbc:postgresql://localhost:5432/mydemo"
user = "foo"
password = "bar"
schemas = arrayOf("public")
locations = arrayOf("classpath:db/migration")
ignoreMigrationPatterns = arrayOf("*:missing")
cleanDisabled = false
}
tasks.withType<FlywayMigrateTask>{
dependsOn("processResources")
}
根据插件的自述文件,第“强制执行 jOOQ 配置 XML 模式版本”,这应该有效吗?
buildscript {
configurations["classpath"].resolutionStrategy.eachDependency {
if (requested.group == "org.jooq-trial-java-8") {
useVersion("3.17.3")
}
}
}
或者,从 jOOQ 3.19 开始,官方插件始终与代码生成器和运行时库版本同步: