当前位置: 首页 > 知识库问答 >
问题:

我正在尝试将Xml文档转换为java对象。它在参数serviceproviders中显示数组索引越界异常

衡丰茂
2023-03-14
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "Data")
public class Data {
    @JacksonXmlProperty(localName="ServiceProviders")
private ServiceProviders serviceproviders;

public ServiceProviders getServiceproviders() {
    return serviceproviders;
}

public void setServiceproviders(ServiceProviders serviceproviders) {
    this.serviceproviders = serviceproviders;
}

public Data() {
    super();
}

@Override
public String toString() {
    return "Data [serviceproviders=" + serviceproviders + "]";
}


}

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "ServiceProviders")
public class ServiceProviders {
    
    @JacksonXmlElementWrapper(localName="ServiceProvider")
@JsonProperty("ServiceProvider")
private List<ServiceProvider> serviceprovider;

public ServiceProviders() {
    super();
}

public List<ServiceProvider> getServiceprovider() {
    return serviceprovider;
}

public void setServiceprovider(List<ServiceProvider> serviceprovider) {
    this.serviceprovider = serviceprovider;
}

@Override
public String toString() {
    return "ServiceProviders [serviceprovider=" + serviceprovider + "]";
}
}
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "ServiceProvider")
public class ServiceProvider {
    
    @JacksonXmlProperty(localName = "ID")
      @JsonProperty("ID")
    private String id;
    @JacksonXmlProperty(localName = "Name")
    private String Name;
    
    public ServiceProvider() {
        super();
    }
    
    public String getId() {
        
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    public ServiceProvider(String id, String name) {
        super();
        this.id = id;
        Name = name;
    }
    @Override
    public String toString() {
        return "ServiceProvider [id=" + id + ", Name=" + Name + "]";
    }
    
   
}
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Parser {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new XmlMapper();
        // Reads from XML and converts to POJO
        Data data = objectMapper.readValue(
                StringUtils.toEncodedString(Files.readAllBytes(Paths.get("C:\\Users\\d.roopa.gadiparthi\\Desktop\\sprint25\\CREtoJSON\\src\\main\\resources\\CRE.xml")), StandardCharsets.UTF_8),
                Data.class);
        System.out.println(data.getServiceproviders().getServiceprovider().get(1));
//        ServiceProvider data1 = objectMapper.readValue(
//                StringUtils.toEncodedString(Files.readAllBytes(Paths.get("C:\\Users\\d.roopa.gadiparthi\\Desktop\\sprint25\\CREtoJSON\\src\\main\\resources\\CRE.xml")), StandardCharsets.UTF_8),
//                ServiceProvider.class);
//        System.out.println(data1.getId()+data1.getName());
       
    }
}

<Data>
<ServiceProviders>
      <ServiceProvider ID="0" Name="0:Divya" />
      <ServiceProvider ID="1" Name="1:Roopa" />
      <ServiceProvider ID="2" Name="2:ransit" />
     </ServiceProviders>
  </Data>
dependecies are
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.4</version>
</dependency>
</dependencies>

线程“main”java.lang.indexoutOfboundsException:在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:64),在java.base/jdk.internal.util.preconditions.outofboundscheckindex(preconditions.java:70),在java.base/jdk.internal.util.preconditions.checkindex(preconditions.java:248),在爪哇:18)

共有1个答案

闾丘炫明
2023-03-14

问题出在ServiceProviders类中。在这里,您通过以下方式对 元素的序列进行了建模:

@JacksonXmlElementWrapper(localName = "ServiceProvider")
@JsonProperty("ServiceProvider")
private List<ServiceProvider> serviceprovider;

这意味着,在 ... 中,您希望XML输入如下所示

<ServiceProvider>
    <ServiceProvider ID="0" Name="0:Divya" />
    <ServiceProvider ID="1" Name="1:Roopa" />
    <ServiceProvider ID="2" Name="2:ransit" />
</ServiceProvider>

而不是简单地

<ServiceProvider ID="0" Name="0:Divya" />
<ServiceProvider ID="1" Name="1:Roopa" />
<ServiceProvider ID="2" Name="2:ransit" />

当然,您不希望额外的 ... 包装。因此,您需要将@JacksonXmlElementWrapper注释修改为

@JacksonXmlElementWrapper(useWrapping = false)
 类似资料:
  • 这是我的代码: 该程序的目的是要求用户输入一个字符串,然后统计字符串中每个字符的使用次数。 当我去编译程序时,它工作正常。当我运行程序时,我可以在弹出框中输入字符串,但是在我提交字符串并按确定后,我得到一个错误,说 我不完全确定问题是什么或如何解决。

  • 我的目标是创建一个新的实例,其中前2个元素是原始元素,之后是最后3个元素的中间值。例如,< code>[5,2,9,1,7,4,6,3,8]变成< code>[5,2,5,2,7,4,6,4,6]。 我解决这个问题的方法是创建2个新的数组列表,其中一个是从索引2开始的3个元素之间的子数组,具有排序,最后将新子数组的索引1放入我的新数组列表中。但是,这会遇到索引越界错误。

  • 我正在尝试将java对象转换为xml文件。 这是对象的类: 这是我用来转换对象的类: 当我运行main方法时,我得到了这个堆栈跟踪: 试图寻找解决方案,但仍然无法解决问题。 每个建议都非常感谢,提前感谢

  • 问题内容: 在我的游戏代码中,我尝试添加一张手牌。一旦我做完了,我的数组就超出了范围。一切看起来都不错,但也许我缺少了一些东西。 仅供参考,一个和两个是Player实例。来自Main类的相关代码(对格式感到抱歉。我很想将其传输到Stack Overflow): 卡类: 玩家等级: 问题答案: 问题出在你的循环上 没有其他任何值可设置,因此此循环不断循环,直到所有玩家拥有超过52张牌为止。一旦某人拥

  • 我一直在四处寻找是否有任何东西可以帮助我,但我不太了解人们的回答,任何我所了解的似乎都不能解决问题!所以基本上正如标题所说,我得到了一个数组索引越界异常,但我不知道为什么。非常感谢任何帮助。 代码:

  • 这似乎微不足道,但也许我对向量的理解并不是它应该是的。我在这段代码上得到[java.lang.ArrayIndexOutOfBoundsException:Array index out of range:1]。错误发生在第3行。既然look是基于向量的大小,那么数组怎么会越界呢? 方法“getChangeSets()”返回一个列表。该列表最初是作为向量创建的。