
WildFly 26 升级后 Jackson 自定义注解(如 @JsonValue、@JsonSerialize)和日期格式化(@JsonFormat)失效,根本原因是类路径中存在冲突的 Jackson 版本——自定义安全模块引入了高版本 Jackson JAR,覆盖了 WildFly 内置的 RESTEasy Jackson 2 提供器。
wildfly 26 升级后 jackson 自定义注解(如 `@jsonvalue`、@jsonserialize)和日期格式化(@jsonformat)失效,根本原因是类路径中存在冲突的 jackson 版本——自定义安全模块引入了高版本 jackson jar,覆盖了 wildfly 内置的 resteasy jackson 2 提供器。
在从 WildFly 23 升级至 26 的过程中,Jackson 序列化行为异常(如 @JsonValue 不生效、@JsonSerialize 自定义序列器未调用、@JsonFormat 被忽略)并非配置或代码逻辑错误,而是一个典型的 类加载冲突问题:WildFly 26 默认使用 RESTEasy 集成的 resteasy-jackson2-provider(基于 Jackson 2.13+),但项目中自定义的安全模块(如 Elytron 登录模块)显式打包并声明了独立的 Jackson 依赖(如 jackson-databind-2.13.4.2.jar),导致这些第三方 JAR 被优先加载,从而绕过了 WildFly 的标准 JSON 处理链。
✅ 正确解决方案
1. 移除模块内嵌的 Jackson JAR
检查你的自定义安全模块(通常位于 $WILDFLY_HOME/modules/system/layers/base/<your-module>/main/module.xml),删除所有 <resource-root> 中对 jackson-core、jackson-databind、jackson-annotations 的引用,例如:
<!-- ❌ 错误:手动引入 Jackson,引发版本冲突 --> <resource-root path="jackson-databind-2.13.4.2.jar"/> <resource-root path="jackson-core-2.13.4.jar"/> <resource-root path="jackson-annotations-2.13.4.jar"/>
2. 声明标准 WildFly Jackson 依赖
在 module.xml 的 <dependencies> 中,仅声明 WildFly 官方提供的 RESTEasy Jackson 集成模块:
<dependencies>
<!-- ✅ 正确:复用 WildFly 内置的 Jackson 2 支持 -->
<module name="org.jboss.resteasy.resteasy-jaxrs"/>
<module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
<!-- 其他必要依赖(如 security 相关)保持不变 -->
</dependencies>? resteasy-jackson2-provider 模块已预集成 Jackson 2.13.x(与 WildFly 26 兼容),并自动注册 JacksonJsonProvider,确保 @JsonValue、@JsonSerialize、@JsonFormat 等注解被正确识别和执行。
3. 强制 RESTEasy 优先使用 Jackson(推荐)
在 WildFly 启动脚本(如 standalone.conf 或 JVM 启动参数)中添加系统属性,避免 RESTEasy 因模块顺序或检测逻辑误选 Jakarta JSON-B:
-D"resteasy.preferJacksonOverJsonB"="true"
该配置明确指示 RESTEasy 在存在多个 JSON 提供器时优先选用 Jackson 2,消除不确定性。
4. Maven 依赖调整(可选但强烈建议)
将 pom.xml 中 Jackson 依赖的 <scope> 从 provided 改为 compile(或直接移除),*并排除所有 `jackson-` 依赖**,因为 WildFly 已提供且不应由应用重复供给:
<!-- ❌ 删除或注释掉以下依赖(避免 WAR 内嵌 Jackson) -->
<!--
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.7.1</version>
<scope>provided</scope>
</dependency>
-->同时,在 jboss-deployment-structure.xml 中确保 不额外声明 javax.api 或 org.jboss.resteasy.resteasy-jaxrs 为 deployment 依赖(除非有特殊覆盖需求),因其已是 WildFly 系统层模块。
⚠️ 注意事项与验证步骤
- 重启必须完整:修改 module.xml 后需完全停止 WildFly 并清除 standalone/tmp/ 和 standalone/data/ 下缓存(或使用 --clean 启动),避免旧类加载器残留。
-
验证序列化行为:部署后访问 /jsontest/json,应返回纯 JSON 数组:
[{"a":"a1","b":"b1"},{"a":"a2","c":"c2"}]而非 { "objects": [...] }。
- 验证日期格式:为 SomeObject 添加 LocalDateTime 字段并标注 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"),确认输出符合指定格式。
- 日志辅助诊断:启用 Jackson 日志(logging.properties 中添加 logger.org.jboss.resteasy.plugins.providers.jackson.level=DEBUG),观察 JacksonJsonProvider 是否被注册及序列化流程是否触发。
通过以上调整,你将彻底解决 WildFly 26 中 Jackson 自定义序列化“静默失效”的问题——核心在于信任 WildFly 的模块化运行时,避免手动引入冲突的第三方库,让标准注解回归预期行为。

















