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>
error Exception in thread “main” java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) at java.base/java.util.Objects.checkIndex(Objects.java:373) at java.base/java.util.ArrayList.get(ArrayList.java:427) at Parser.main(Parser.java:18)
Advertisement
Answer
The problem is in your ServiceProviders
class.
There you have modeled the sequence of <ServiceProvider>
elements by
@JacksonXmlElementWrapper(localName = "ServiceProvider")
@JsonProperty("ServiceProvider")
private List<ServiceProvider> serviceprovider;
That means, within <ServiceProviders>...</ServiceProviders>
you expect XML input like this
<ServiceProvider>
<ServiceProvider ID="0" Name="0:Divya" />
<ServiceProvider ID="1" Name="1:Roopa" />
<ServiceProvider ID="2" Name="2:ransit" />
</ServiceProvider>
instead of simply
<ServiceProvider ID="0" Name="0:Divya" />
<ServiceProvider ID="1" Name="1:Roopa" />
<ServiceProvider ID="2" Name="2:ransit" />
Of course you do not want the extra <ServiceProvider>...</ServiceProvider>
wrapping.
Therefore you need to modify the @JacksonXmlElementWrapper
annotation to simply
@JacksonXmlElementWrapper(useWrapping = false)