Java Jackson XML转对象遇UnrecognizedPropertyException问题求助
解决Jackson XML反序列化时的UnrecognizedPropertyException异常
看起来你在使用Jackson将XML转换成Java对象时遇到了属性识别异常,我来帮你分析问题并给出解决办法。
异常原因
你看到的UnrecognizedPropertyException是因为Jackson的映射逻辑被错误的注解配置搞乱了:
- 你的
PropertyXml类里多了一个property字段和对应的注解,这会让Jackson误以为<property>节点的文本内容需要映射到这个字段,但实际上<property>只有属性没有文本,反而干扰了属性的映射。 Properties类的注解配置完全错误,没有正确指定它要处理的<property>子节点,导致Jackson把<property>的name属性当成了Properties类的字段,自然就找不到对应的定义了。
修正步骤
下面是修正后的关键代码,你可以直接替换对应的类:
1. 修正PropertyXml类
移除多余的property字段,只保留属性对应的字段:
@Data public class PropertyXml { @JacksonXmlProperty(isAttribute = true, localName = "name") private String name; @JacksonXmlProperty(isAttribute = true, localName = "value") private String value; }
这个类直接对应XML中的<property>节点,Jackson会自动把节点的name和value属性映射到这两个字段上。
2. 修正Properties类
调整注解,正确指定子节点的映射关系:
@Data @AllArgsConstructor @NoArgsConstructor public class Properties { // 禁用额外包裹,因为<Properties>本身就是列表的父节点 @JacksonXmlElementWrapper(useWrapping = false) // 声明列表元素对应XML的<property>节点 @JacksonXmlProperty(localName = "property") private List<PropertyXml> properties = new ArrayList<>(); }
这里的核心是告诉Jackson:<Properties>节点下直接包含多个<property>子节点,这些子节点要映射到properties列表中。
3. 完善其他类的注解
别忘了给ConnectionData、Endpoint、Link这些类加上@Data注解(或者手动添加getter/setter),Jackson需要通过这些方法来给字段赋值。另外,Password类也需要正确配置属性映射,比如:
@Data public class Password { @JacksonXmlProperty(isAttribute = true, localName = "encryptInitString") private String encryptInitString; @JacksonXmlProperty(isAttribute = true, localName = "encrypted") private String encrypted; @JacksonXmlProperty(isAttribute = true, localName = "value") private String value; }
验证
替换完这些代码后,重新运行你的反序列化服务,应该就能成功将XML解析成Link对象了,不会再抛出那个属性识别异常。
内容的提问来源于stack exchange,提问作者María Del Dedo Castillo
相关产品推荐
相关产品推荐

