Wildfly 26中自定义Jackson JSON序列化失效问题求助
Wildfly 26升级后JSON序列化问题解决
问题描述
将大型项目从Wildfly 23升级至Wildfly 26后,出现两个JSON序列化异常:
- 带
@JsonValue注解的列表包装类未返回预期数组:ResponseListWrapper的getObjects()方法标注@JsonValue,预期输出[ ... ]格式的JSON数组,但实际返回{ "objects": [ ... ] },且ResponseList上的自定义序列化器JacksonListSerializer未被触发。 - 标注
@JsonFormat(pattern = ...)的日期字段未按指定格式序列化。
环境信息
- Java 11.0.14.1(Eclipse Adoptium)
- Maven 3.6.3
- Wildfly 26(Windows 10构建,Windows Server 2019部署)
- 极简复现项目已准备:执行
mvn clean verify生成target\jsontest.war,部署至Wildfly成功。
服务器无关警告
WARN [org.jboss.as.dependency.deprecated] (MSC service thread 1-5) WFLYSRV0221: Deployment "deployment.jsontest.war" is using a deprecated module ("javax.api") which may be removed in future versions without notice. WARN [org.jboss.as.dependency.deprecated] (MSC service thread 1-5) WFLYSRV0221: Deployment "deployment.jsontest.war" is using a deprecated module ("org.jboss.resteasy.resteasy-jaxrs") which may be removed in future versions without notice.
解决方案
问题1:@JsonValue与自定义序列化器失效
Wildfly 26中Resteasy与Jackson的集成逻辑有调整,默认配置可能未正确加载Jackson注解处理器或存在模块冲突。
1. 修正jboss-deployment-structure.xml
移除过时依赖,确保Jackson2 Provider被正确导入并优先加载:
<jboss-deployment-structure> <deployment> <dependencies> <module name="org.wildfly.security.elytron"/> <module name="org.wildfly.extension.elytron"/> <module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import"/> </dependencies> <exclude-subsystems> <subsystem name="resteasy"/> </exclude-subsystems> </deployment> </jboss-deployment-structure>
services="import":确保Jackson的序列化服务被容器识别- 排除默认resteasy子系统:避免与自定义Jackson配置冲突
2. 强制触发自定义序列化逻辑
若@JsonValue仍不生效,为ResponseListWrapper添加自定义序列化器:
public class ResponseListWrapperSerializer extends JsonSerializer<ResponseListWrapper<?>> { @Override public void serialize(ResponseListWrapper<?> wrapper, JsonGenerator generator, SerializerProvider provider) throws IOException { provider.defaultSerializeValue(wrapper.getObjects(), generator); } }
在ResponseListWrapper类上添加注解:
@JsonSerialize(using = ResponseListWrapperSerializer.class) public class ResponseListWrapper<T> { // 原有代码保持不变 }
3. 确认Jackson版本一致性
Wildfly 26自带Jackson 2.12.x,与pom.xml中指定版本匹配,确保jackson-databind和jackson-annotations的scope为provided,避免打包时引入冲突版本。
问题2:@JsonFormat日期格式化失效
1. 注册Jackson时间模块
创建自定义JAX-RS应用类,显式注册JavaTimeModule(针对Java 8+时间API):
package org.example.jsontest; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; public class JsonTestApplication extends Application { @Override public Set<Object> getSingletons() { Set<Object> singletons = new HashSet<>(); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); // 可选:全局统一日期格式 // mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); singletons.add(new org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider(mapper)); singletons.add(new MainResource()); return singletons; } }
2. 修改web.xml映射
将默认JAX-RS应用替换为自定义类:
<servlet> <servlet-name>JsonTestApplication</servlet-name> <servlet-class>org.example.jsontest.JsonTestApplication</servlet-class> </servlet> <servlet-mapping> <servlet-name>JsonTestApplication</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
3. 验证日期字段注解
确保日期字段的@JsonFormat配置完整,例如:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssZ", timezone = "UTC") private LocalDateTime createTime;
验证部署
重新执行mvn clean verify生成WAR包并部署:
- 访问
/jsontest/json应返回[ {"a":"a1","b":"b1"}, {"a":"a2","c":"c2"} ] - 日期字段需按指定格式输出
内容的提问来源于stack exchange,提问作者user3127347
相关产品推荐
相关产品推荐

