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

fasterxml反序列化带属性XML元素失败,忽略未知属性配置无效如何解决?

报错原因

你的id_manufacturerXML节点携带了xlink:href属性,Jackson在解析时会默认将带属性的节点识别为对象结构,而非直接读取节点内的文本值赋值给int类型字段,因此抛出类型不匹配异常。你添加的@JsonIgnoreProperties(ignoreUnknown = true)仅能忽略实体类未定义的对象属性,无法解决节点类型识别错误的问题。

可行解决方案

方案1:使用@JacksonXmlText注解直接绑定节点文本(最简便)

直接在id_manufacturer字段上添加Jackson XML提供的文本绑定注解,强制读取节点的文本内容作为字段值,属性会被自动忽略(如果需要保留属性也可以新增对应字段存储)。
修改后实体类代码如下:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;

@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class Product {
    public int id;
    // 强制绑定节点内的文本内容
    @JacksonXmlText
    public int id_manufacturer;
    
    // 若需要保留xlink:href属性可新增以下字段,不需要则无需添加
    // @JacksonXmlProperty(isAttribute = true, localName = "href", namespace = "http://www.w3.org/1999/xlink")
    // private String manufacturerHref;
}

原有执行代码不需要修改即可正常解析。

方案2:自定义反序列化器(适用于不能修改实体类结构的场景)

如果不希望修改实体类的注解配置,可以自定义int类型的反序列化器,自动适配带属性的节点解析:

  1. 自定义反序列化器实现:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.TreeNode;
import java.io.IOException;

public class IntXmlTextDeserializer extends StdDeserializer<Integer> {
    public IntXmlTextDeserializer() {
        super(Integer.class);
    }

    @Override
    public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 处理带属性的对象节点
        if (p.currentToken() == JsonToken.START_OBJECT) {
            TreeNode node = p.getCodec().readTree(p);
            // Jackson会把带属性节点的文本内容存在空字符串key下
            TreeNode textNode = node.get("");
            if (textNode != null && textNode.isValueNode()) {
                return Integer.parseInt(textNode.asText().trim());
            }
        }
        // 普通无属性节点直接取值
        return p.getIntValue();
    }
}
  1. 给对应字段绑定反序列化器:
// 在Product类的id_manufacturer字段上添加注解
@JsonDeserialize(using = IntXmlTextDeserializer.class)
public int id_manufacturer;

方案3:升级Jackson版本

你当前使用的2.7.4是2016年发布的老旧版本,2.12及以上版本的Jackson XML模块优化了带属性简单类型节点的解析逻辑,升级版本后不需要修改代码即可直接兼容该场景。
升级依赖配置参考:

implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: '2.15.2'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:54:02