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类型的反序列化器,自动适配带属性的节点解析:
- 自定义反序列化器实现:
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(); } }
- 给对应字段绑定反序列化器:
// 在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
相关产品推荐
相关产品推荐

