Jackson使用JsonTypeInfo.DEDUCTION反序列化出现EnumConstantNotPresentException异常
根因分析
这个异常的核心原因是Wildfly容器的类加载优先级冲突。JsonTypeInfo.Id.DEDUCTION是Jackson 2.12版本才新增的枚举值,你本地环境没有问题是因为运行时加载的是你指定的2.12.2版本Jackson包,但Wildfly 21默认自带的Jackson版本为2.11.x,默认类加载规则是父类加载器优先,会优先加载容器自带的低版本jackson-annotations包,导致找不到对应枚举值。你在控制台查到的应用依赖版本只是你WAR包内打包的版本,不是实际运行时加载的版本。
这个报错和你业务代码里有没有用到枚举无关,是Jackson内部处理多态相关注解逻辑时触发的。
解决方案
- 第一步:在WAR包的
WEB-INF目录下新增jboss-deployment-structure.xml配置文件,强制排除容器自带的Jackson相关模块,让应用优先加载自身打包的Jackson依赖,配置示例如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclusions> <module name="com.fasterxml.jackson.core.jackson-annotations" /> <module name="com.fasterxml.jackson.core.jackson-core" /> <module name="com.fasterxml.jackson.core.jackson-databind" /> <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" /> <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310" /> </exclusions> </deployment> </jboss-deployment-structure>
- 第二步:核对你项目的依赖配置,确保所有Jackson相关依赖的版本统一为2.12.2,避免出现同项目内Jackson多版本共存的问题
- 第三步:如果修改配置后问题仍存在,可以在调用反序列化逻辑前加入调试代码,确认运行时实际加载的
JsonTypeInfo.Id类来自哪个Jar包:
System.out.println(JsonTypeInfo.Id.class.getProtectionDomain().getCodeSource().getLocation());
内容的提问来源于stack exchange,提问作者Pettan
相关产品推荐
相关产品推荐

