InputAnnotationIntrospectorV3.kt
package io.github.lishangbu.avalon.jimmer.jackson
import org.babyfish.jimmer.Input
import tools.jackson.core.Version
import tools.jackson.databind.AnnotationIntrospector
import tools.jackson.databind.annotation.JsonPOJOBuilder
import tools.jackson.databind.cfg.MapperConfig
import tools.jackson.databind.introspect.AnnotatedClass
/**
* 为 Jimmer KSP 生成的 Input DTO 补充 Jackson 3 的 Builder 发现能力。
*
* 这些 DTO 仍然生成了 `com.fasterxml.jackson.*` 注解,运行在 `tools.jackson.*`
* 时无法自动识别,因此这里按 Jimmer Input 的约定补齐 Builder 元数据。
*/
class InputAnnotationIntrospectorV3 : AnnotationIntrospector() {
override fun version(): Version =
Version(
1,
0,
0,
null,
"io.github.lishangbu.avalon",
"avalon-jimmer",
)
override fun findPOJOBuilder(
config: MapperConfig<*>?,
ac: AnnotatedClass,
): Class<*>? {
val inputType = ac.annotated
if (!Input::class.java.isAssignableFrom(inputType)) {
return super.findPOJOBuilder(config, ac)
}
return inputType.declaredClasses.firstOrNull { it.simpleName == "Builder" }
?: super.findPOJOBuilder(config, ac)
}
override fun findPOJOBuilderConfig(
config: MapperConfig<*>?,
ac: AnnotatedClass,
): JsonPOJOBuilder.Value? {
val declaringType = ac.annotated.declaringClass
if (declaringType != null && Input::class.java.isAssignableFrom(declaringType)) {
return JsonPOJOBuilder.Value("build", "")
}
return super.findPOJOBuilderConfig(config, ac)
}
}