You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wildfly 26中自定义Jackson JSON序列化失效问题求助

Wildfly 26升级后JSON序列化问题解决

问题描述

将大型项目从Wildfly 23升级至Wildfly 26后,出现两个JSON序列化异常:

  1. 带@JsonValue注解的列表包装类未返回预期数组:ResponseListWrapper的getObjects()方法标注@JsonValue,预期输出[ ... ]格式的JSON数组,但实际返回{ "objects": [ ... ] },且ResponseList上的自定义序列化器JacksonListSerializer未被触发。
  2. 标注@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:18:13