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

Wildfly 26及以上版本JAX-RS JSON列表反序列化异常问题

解决Wildfly 25+中JAXB实体JSON列表反序列化失败问题

问题根源

Wildfly 25及以上版本默认将JSON处理组件从Jackson(带JAXB注解支持)切换为JSON-B(Eclipse Yasson),两者对JAXB列表注解的解析逻辑存在差异,导致原Jackson能正常处理的列表属性,在JSON-B下无法正确反序列化。XML请求不受影响是因为XML始终使用JAXB原生解析,未更换组件。


解决方案

方案1:切换回Jackson作为JSON处理器(推荐,兼容原有代码)

通过配置强制RESTEasy使用Jackson替代默认的JSON-B,无需修改实体类:

  • 在WAR包的WEB-INF/web.xml中添加上下文参数:
    <context-param>
        <param-name>resteasy.preferJacksonOverJsonB</param-name>
        <param-value>true</param-value>
    </context-param>
    
  • 或者通过jboss-deployment-structure.xml排除JSON-B子系统并引入Jackson依赖:
    <jboss-deployment-structure>
        <deployment>
            <exclude-subsystems>
                <subsystem name="jsonb"/>
            </exclude-subsystems>
            <dependencies>
                <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" export="true"/>
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    

方案2:适配JSON-B(保留默认组件)

如果想使用Wildfly默认的JSON-B,需要调整实体类的注解或XJC绑定配置:

  1. 检查XSD生成的JAXB注解:确保列表属性的@XmlElement指定了明确的元素名称,比如:
    @XmlElement(name = "complexItem")
    protected List<ComplexType> complexItemList;
    
    JSON-B依赖@XmlElement的name属性识别重复的数组元素,缺少该属性可能导致解析失败。
  2. 添加JSON-B专属注解:在列表属性上添加@JsonbXmlElementWrapper(useWrapping = false)(如果JSON请求中没有外层包装节点):
    import jakarta.json.bind.annotation.JsonbXmlElementWrapper;
    
    @JsonbXmlElementWrapper(useWrapping = false)
    @XmlElement(name = "complexItem")
    protected List<ComplexType> complexItemList;
    
  3. 调整XJC全局绑定:确认绑定文件(如bindings.xjb)中配置了正确的集合类型:
    <jaxb:globalBindings>
        <jaxb:collectionType>java.util.List</jaxb:collectionType>
    </jaxb:globalBindings>
    
    避免生成数组类型(JSON-B对数组的处理逻辑和List有差异)。

验证

部署修改后的WAR包,发送包含列表的JSON请求,检查是否能正确反序列化TopLevelObject的列表属性。

内容的提问来源于stack exchange,提问作者CRG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:05:22