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绑定配置:
- 检查XSD生成的JAXB注解:确保列表属性的
@XmlElement指定了明确的元素名称,比如:
JSON-B依赖@XmlElement(name = "complexItem") protected List<ComplexType> complexItemList;@XmlElement的name属性识别重复的数组元素,缺少该属性可能导致解析失败。 - 添加JSON-B专属注解:在列表属性上添加
@JsonbXmlElementWrapper(useWrapping = false)(如果JSON请求中没有外层包装节点):import jakarta.json.bind.annotation.JsonbXmlElementWrapper; @JsonbXmlElementWrapper(useWrapping = false) @XmlElement(name = "complexItem") protected List<ComplexType> complexItemList; - 调整XJC全局绑定:确认绑定文件(如
bindings.xjb)中配置了正确的集合类型:
避免生成数组类型(JSON-B对数组的处理逻辑和List有差异)。<jaxb:globalBindings> <jaxb:collectionType>java.util.List</jaxb:collectionType> </jaxb:globalBindings>
验证
部署修改后的WAR包,发送包含列表的JSON请求,检查是否能正确反序列化TopLevelObject的列表属性。
内容的提问来源于stack exchange,提问作者CRG
相关产品推荐
相关产品推荐

