Thorntail部署含多态REST API Payload的应用时出现空指针异常
根因定位
该空指针异常由Thorntail 2.5.0内置的低版本SmallRye OpenAPI组件导致,该版本在扫描标注了Jackson多态注解的抽象类参数时,未对类型对象做非空校验,且对标注在Setter方法上的多态注解兼容逻辑存在缺陷,最终触发NPE。
排查步骤
- 先验证是否为OpenAPI组件导致:在项目配置文件
project-defaults.yml中添加配置thorntail.microprofile.openapi.enabled: false,重启应用如果不再报错即可确认根因。 - 若确认是OpenAPI扫描问题,断点定位到异常栈中的
TypeUtil.getAnnotation第281行,查看当前扫描的类信息,确认是否为多态Payload相关的类。
解决方案
方案1(最快,无需改业务代码)
若业务不需要自动生成OpenAPI接口文档,直接保留上述禁用OpenAPI扩展的配置即可完成部署。
方案2(保留OpenAPI能力,改注解位置)
将当前标注在setPayload方法上的@JsonTypeInfo和@JsonSubTypes注解移动到Payload抽象类的类定义上,示例代码如下:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "eventType") @JsonSubTypes({ @JsonSubTypes.Type(value = PayloadDocument.class, name = "document"), @JsonSubTypes.Type(value = PayloadCampaign.class, name = "campaign"), @JsonSubTypes.Type(value = PayloadMessage.class, name = "message") }) public abstract class Payload { // 原有类逻辑不变 }
如果修改后仍报错,在Payload类上额外添加空的@Schema注解即可。
方案3(替换依赖)
排除Thorntail内置的低版本SmallRye OpenAPI依赖,手动引入修复了该NPE问题的1.1.2及以上版本SmallRye OpenAPI,需注意依赖版本兼容性,避免和Thorntail核心组件冲突。
内容的提问来源于stack exchange,提问作者Mike Brunner
相关产品推荐
相关产品推荐

