Jaxb 生成的带有可为空字段的源

Jaxb generated sources with nullable fields

我有一个 kotlin 项目,我在其中使用来自 xsd 的 Jaxb 生成的 src 文件。这些生成源的问题是它们有 nullable 字段,但 IDEA 不知道。它可能导致 production 中的错误。要修复它,我们可以在生成的 srs-es 中的所有 getters 添加 @Nullable 注释。

怎样才能优雅地做到?

我做了这个解决方案,它对我有用,但也许有人知道更好的方法?

Gradle kt 任务

tasks.register("nullableForXsdFields") {
    group = "code generation"
    description = "Add Nullable annotation to generated jaxb files"
    actions.add {
        val xjcFiles = fileTree("$buildDir/generated-sources/main/xjc")
        xjcFiles.forEach { xjcFile ->
            var content = xjcFile.readText()
            Regex("(public) (\w+|<|>|\*) (get)").findAll(content).distinct()
                .forEach { match ->
                    content = content.replace(
                        match.groups[0]!!.value,
                        match.groups[0]!!.value.replace("public ", "public @Nullable ")
                    )
                }.run {
                    content = content.replace(
                        "import javax.xml.bind.annotation.XmlType;",
                        "import javax.xml.bind.annotation.XmlType;\nimport org.jetbrains.annotations.Nullable;"
                    )
                }
            xjcFile.writeBytes(content.toByteArray())
        }
    }
}
tasks.getByName("xjcGeneration").finalizedBy("nullableForXsdFields")
tasks.getByName("compileKotlin").dependsOn("nullableForXsdFields")
tasks.getByName("compileJava").dependsOn("nullableForXsdFields")

xjcGeneration - 是我从 xsd

生成 src 的插件

我遇到了同样的问题,所以我为 maven jaxb 插件创建了一个扩展 com.github.labai:labai-jsr305-jaxb-plugin.

此扩展默认将所有生成的包标记为nullable,然后仅使用@NotNull标记那些必填的字段xsd 方案。

您可以在 github 中找到有关如何将其与 Maven 一起使用的更多详细信息 https://github.com/labai/labai-jsr305