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

使用Jackson序列化XML正常但反序列化为Java POJOs时出错求助

问题分析与解决方案

错误原因

序列化正常但反序列化失败的核心问题在于:Jackson XML反序列化时,无法通过带@JsonCreator的带参构造方法,正确将XML中被<dependencies>包裹的集合结构映射到List<Dependency>参数上。

Jackson在处理XML集合时,依赖@JacksonXmlElementWrapper和@JacksonXmlProperty的组合来识别容器节点和子元素,但带参构造方法的参数没有和XML的容器节点做正确绑定,导致Jackson误将<dependencies>当作普通对象而非集合容器,抛出类型不匹配错误。


解决方案

方案1:添加无参构造方法(推荐)

Jackson默认需要无参构造来实例化对象,结合@Getter/@Setter生成的setter方法,即可正常完成反序列化。修改后的实体类如下:

LicenseSummary.java

@Getter
@Setter
@JacksonXmlRootElement(localName = "licenseSummary")
@EqualsAndHashCode
public class LicenseSummary {
    @NonNull
    @JacksonXmlProperty(localName = "dependency")
    @JacksonXmlElementWrapper(localName = "dependencies")
    List<Dependency> dependencies;

    // 添加无参构造,供Jackson反序列化使用
    public LicenseSummary() {}

    // 保留原有带参构造,不影响业务代码使用
    public LicenseSummary(@NonNull List<Dependency> dependencies) {
        this.dependencies = dependencies;
    }
}

Dependency.java

@Getter
@Setter
@EqualsAndHashCode
public class Dependency {
    @NonNull
    @JacksonXmlProperty(localName = "groupId")
    private String groupId;

    // 添加无参构造
    public Dependency() {}

    // 保留原有带参构造
    public Dependency(@NonNull String groupId) {
        this.groupId = groupId;
    }
}

方案2:调整@JsonCreator的参数绑定(适合必须保留带参构造的场景)

如果一定要用带@JsonCreator的构造方法,需要给构造方法的参数添加注解,明确对应XML的节点名称:

LicenseSummary.java

@Getter
@Setter
@JacksonXmlRootElement(localName = "licenseSummary")
@EqualsAndHashCode
public class LicenseSummary {
    @NonNull
    @JacksonXmlProperty(localName = "dependency")
    @JacksonXmlElementWrapper(localName = "dependencies")
    List<Dependency> dependencies;

    @JsonCreator
    public LicenseSummary(
            // 明确指定参数对应XML的容器节点dependencies
            @JacksonXmlProperty(localName = "dependencies") @NonNull List<Dependency> dependencies
    ) {
        this.dependencies = dependencies;
    }
}

Dependency.java

@Getter
@Setter
@EqualsAndHashCode
public class Dependency {
    @NonNull
    @JacksonXmlProperty(localName = "groupId")
    private String groupId;

    @JsonCreator
    public Dependency(
            // 明确指定参数对应XML的groupId节点
            @JacksonXmlProperty(localName = "groupId") @NonNull String groupId
    ) {
        this.groupId = groupId;
    }
}

内容的提问来源于stack exchange,提问作者Walnussbär

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:47:00