Skip to main content

Spring Boot项目启用native构建后由于序列化对象缺少ReflectionHints导致json数据为'{}'

· One min read
orange
programmer on jvm platform

基于graalvmspring boot项目打包好后调用/scheduling/api/v1/taskDefinitions接口返回如下数据, 其中triggerStrategy字段是空json对象

[
{
"id": "BILLING_SYNC_FOR_DEPLOYMENT_127",
"triggerStrategy": {},
"tags": {
"EXECUTOR": "com.fastonetech.billing.sync.scheduling.BillingSyncTaskExecutor"
},
"variables": {
"SOURCE_RCLONE_CONFIG": "TENCENT_ap-beijing",
"SOURCE_BUCKET": "cheng1201-1310454728",
"SOURCE_PATH": "",
"TARGET_RCLONE_CONFIG": "aggregation",
"TARGET_BUCKET": "billing-aggregation",
"TARGET_PATH": "TENCENT/ap-beijing/cheng1201-1310454728"
}
}
]

原因

triggerStrategy字段对应的java中的类型是interface, 需要为spring-aot进行配置, 以便其能够在运行时被正确地序列化

解决方案

ReflectiveProcessor实现类中新增如下配置, 这里只展示了本次修复的内容
其中, TaskTriggerStrategyinterface, CronTaskTriggerStrategyPeriodicTaskTriggerStrategy为其实现类

class ReflectiveProcessorImpl : ReflectiveProcessor {

override fun registerReflectionHints(hints: ReflectionHints, element: AnnotatedElement) {
val registrar = BindingReflectionHintsRegistrar()
registrar.registerReflectionHints(
hints,
arrayOf(
TaskTriggerStrategy::class.java,
CronTaskTriggerStrategy::class.java,
PeriodicTaskTriggerStrategy::class.java
)
)
}

}

备注