Jackson转换XML为Java对象时ServiceProviders字段引发数组索引越界异常
问题定位
你遇到的数组越界异常,本质是Jackson的XML列表注解配置和实际XML结构完全错配,导致<ServiceProvider>节点根本没有被映射到实体类的列表字段里,最终列表长度为0,取索引1时直接触发越界。
核心错配点
@JacksonXmlElementWrapper的作用是给列表元素加一层独立的专属包裹节点,而你现在把这个注解的包裹节点名设成了ServiceProvider,会让Jackson按照下面的结构找数据:return (<ServiceProviders> <ServiceProvider> <!-- Jackson在这里找列表项 --> </ServiceProvider> </ServiceProviders> )- 但你的实际XML结构里,
<ServiceProvider>就是直接平铺在<ServiceProviders>下面的列表项,根本不存在嵌套的包裹层,Jackson自然匹配不到内容,最终给列表赋值为空。 - 另外两个冗余注解的干扰:
ServiceProviders类上的@JacksonXmlRootElement属于多余配置,这个类是Data下的子节点,不是根节点,会让Jackson解析时出现元素识别冲突ServiceProvider类上混用的@JsonProperty是JSON场景的注解,对XML解析没有帮助,反而可能干扰元素、属性的映射关系
逐类修正方案
1. 调整ServiceProviders类的列表配置
删除原来的错误注解,改成和XML结构匹配的配置:
@JacksonXmlRootElement(localName = "ServiceProviders") @JsonIgnoreProperties(ignoreUnknown = true) public class ServiceProviders { // 关闭额外的列表包裹层,因为<ServiceProviders>本身就是外层容器 @JacksonXmlElementWrapper(useWrapping = false) // 指定列表项的节点名为ServiceProvider @JacksonXmlProperty(localName = "ServiceProvider") private List<ServiceProvider> serviceprovider; // 原有getter、setter、构造方法保留即可 }
2. 调整ServiceProvider类的属性映射
你的XML里<ServiceProvider>的ID、Name是节点属性,不是子元素,所以要给字段加上属性识别配置:
public class ServiceProvider { // 指定ID为节点属性,对应XML里的ID="xxx" @JacksonXmlProperty(localName = "ID", isAttribute = true) private String id; // 指定Name为节点属性,对应XML里的Name="xxx" @JacksonXmlProperty(localName = "Name", isAttribute = true) private String name; // 原有getter、setter、构造方法保留即可 }
3. 补全基础配置
- 给
Data类补上缺失的@JsonIgnoreProperties导入,避免编译报错 - 取列表元素前增加判空判断,避免XML结构异常时再次触发空指针、越界问题:
List<ServiceProvider> providerList = data.getServiceproviders().getServiceprovider(); if (providerList != null && providerList.size() > 1) { System.out.println(providerList.get(1)); }
内容的提问来源于stack exchange,提问作者divya roopa
相关产品推荐
相关产品推荐

